快捷搜索: 王者荣耀 脱发

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;
}
经验分享 程序员 微信小程序 职场和发展