Skip to main content

下一个更大元素-ii

题目

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

示例

输入: [1, 2, 1]

输出: [2, -1, 2]

解释:

第一个 1 的下一个更大的数是 2;

数字 2 找不到下一个更大的数;

第二个 1 的下一个最大的数需要循环搜索, 结果也是 2.

题解

还是使用单调栈, 对于循环数组, 一个技巧是使用取模运算来模拟数组长度加倍.

/**
* @param {number[]} nums
* @return {number[]}
*/
var nextGreaterElements = function (nums) {
const n = nums.length
const stack = []
const res = new Array(n).fill(-1)

for (let i = 0; i < n * 2 - 1; i++) {
while (stack.length !== 0 && nums[stack[stack.length - 1]] < nums[i % n]) {
res[stack.pop()] = nums[i % n]
}

stack.push(i % n)
}

return res
}