503. 下一个更大元素 II

108 阅读2分钟

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

题解:


/**
 * @param {number[]} nums
 * @return {number[]}
 */
// 单调栈
var nextGreaterElements = function (nums) {
    const n = nums.length;
    const ret = new Array(n).fill(-1);
    const stk = [];
    // n*2 -1 相当于两倍的nums长度
    // i % n 当超过n后 从0开始
    // 例:[1,2,3,4,3]
    // n => 5  ret = [-1, -1, -1, -1, -1], stk = []

    // i= 0, 不进入while nums = [1,2,3,4,3]
    //     ret = [-1, -1, -1, -1, -1], stk = [0]

    // i= 1, 进入while  nums = [1,2,3,4,3] 
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [0] < nums[1] 成立
    //     ret = [2, -1, -1, -1, -1], stk = [0] => stk = [] => stk = [1]

    // i= 2, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [1] < nums[2] 成立
    //     ret = [2, 3, -1, -1, -1], stk = [1] => stk = [] => stk = [2]

    // i= 3, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [2] < nums[3] 成立
    //     ret = [2, 3, 4, -1, -1], stk = [2] => stk = [] => stk = [3]

    // i= 4, 不进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [3] < nums[4] 不成立
    //     ret = [2, 3, 4, -1, -1], stk = [3] => stk = [3, 4] 

    // i= 5, 不进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [4] < nums[0] 不成立
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4] => stk = [3, 4, 0] 

    // i= 6, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [0] < nums[1] 成立 stk.length > 0 继续循环
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4, 0] => stk = [3, 4] 

    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [4] < nums[1] 不成立 
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4] => stk = [3, 4, 1] 


    // i= 7, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [1] < nums[2] 成立 stk.length > 0 继续循环
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4, 1] => stk = [3, 4] 

    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [4] < nums[2] 不成立 
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4] => stk = [3, 4, 2] 


    // i= 8, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [2] < nums[3] 成立 stk.length > 0 继续循环
    //     ret = [2, 3, 4, -1, -1], stk = [3, 4, 2] => stk = [3, 4] 

    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [4] < nums[3] 成立 
    //     ret = [2, 3, 4, -1, 4], stk = [3, 4] => stk = [3] 

    // i= 9, 进入while  nums = [1,2,3,4,3]
    //     nums[stk[stk.length - 1]] < nums[i % n] => nums [3] < nums[4] 不成立
    //     ret = [2, 3, 4, -1, 4], stk = [3] => stk = [3, 4] 

    // 循环结束 end

    for (let i = 0; i < n * 2 - 1; i++) {
        while (stk.length && nums[stk[stk.length - 1]] < nums[i % n]) {
            ret[stk[stk.length - 1]] = nums[i % n];
            stk.pop();
        }
        stk.push(i % n);
    }
    return ret;
};

来源:力扣(LeetCode)

链接:leetcode.cn/problems/ne…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。