给定一个循环数组 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。