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;
}
