LeetCode - 503下一个更大元素
①这里用单调递减栈,遍历数组,将比栈顶对应的数组元素不断压入stack。一旦遇到当前元素比栈顶对应的nums元素时,意味着在stack里的元素都找到了它的“下一个更大元素”,即,当前元素为stack里所有元素的下一个更大元素。故更新ans(将这些遇到其下一个更大元素的元素对应在ans的位置赋值,赋当前元素对应下标),并且将这些元素都弹出栈(这些元素已解决,接下来不需要再考虑)。 注意:栈内处理的为数组下标,以解决元素不一定连续。
②下标取模 + for循环次数为数组元素个数两倍 --> 解决末尾元素。
/** * Note: The returned array must be malloced, assume caller calls free(). */ #define MAX_NUM 10000 int* nextGreaterElements(int* nums, int numsSize, int* returnSize){ int *stack = calloc(MAX_NUM, sizeof(int)); /* 模拟栈 */ int *result = calloc(numsSize, sizeof(int)); int top = -1;/* 模拟栈顶 */ memset(result, -1, sizeof(int) * numsSize); for (int i = 0; i < 2 * numsSize -1; i++) { int idex = i % numsSize;/* 取模,才能防止下标溢出 */ while (top > -1 && nums[stack[top]] < nums[idex]) { /* 出栈 */ result[stack[top--]] = nums[idex]; } stack[++top] = idex;/* 入栈 */ } *returnSize = numsSize; return result; }