赞
踩
目录
503. 下一个更大元素 II - 力扣(LeetCode)
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]
1 <= nums.length <= 104
-109 <= nums[i] <= 109
类似,我们需要先理解上面这题算法,然后再来看本题。
本题更难一点,因为本题的下一个更大元素可以数组循环查找。
比如输入数组为arr = [100,1,11,1,120,111,123,1,-1,-100],中最后一个元素-100的下一个更大元素是100。
本题的解题思路我是这样考虑的,先将输入数组基于栈结构遍历比较一次,得到stack结果为
arr[0]入栈 | 100入栈 | [100] |
arr[1]入栈 | 1入栈 | [100, 1] |
arr[2]入栈 | 11入栈 | [100, 11] |
arr[3]入栈 | 1入栈 | [100, 11, 1] |
arr[4]入栈 | 120入栈 | [120] |
arr[5]入栈 | 111入栈 | [120, 111] |
arr[6]入栈 | 123入栈 | [123] |
arr[7]入栈 | 1入栈 | [123, 1] |
arr[8]入栈 | -1入栈 | [123, 1, -1] |
arr[9]入栈 | -100入栈 | [123, 1, -1, -100] |
由于下一个更大元素可以循环查找数组,并且此时stack为一个降序结构,因此我们只需要再遍历一次输入数组,即可将stack中除了栈底最大值元素外的其他元素全部弹栈。
- /**
- * @param {number[]} nums
- * @return {number[]}
- */
- var nextGreaterElements = function(nums) {
- let stack = []
-
- let len = nums.length
- let res = new Array(len).fill(-1)
-
- for(let i=0; i<len; i++){
- let ele = nums[i]
- let idx = i
- while(true) {
- if(stack.length === 0) {
- stack.push([ele, idx])
- break;
- } else {
- let [peekEle, peekIdx] = stack[stack.length - 1]
-
- if(ele > peekEle) {
- res[peekIdx] = ele
- stack.pop()
- } else {
- stack.push([ele, idx])
- break;
- }
- }
- }
- }
-
- if(stack.length === 1) return res
-
- for(let i=0; i<len; i++) {
- let ele = nums[i]
-
- while(true) {
- let [peekEle, peekIdx] = stack[stack.length - 1]
- if(ele > peekEle) {
- res[peekIdx] = ele
- stack.pop()
- } else {
- break
- }
- }
- }
-
- return res
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。