[LeetCode] 503. Next Greater Element II
Given a circular integer array nums
(i.e., the next element of nums[nums.length - 1]
is nums[0]
), return the next greater number for every element in nums
.
The next greater number of a number x
is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, return -1
for this number.
Example 1:
Input: nums = [1,2,1] Output: [2,-1,2] Explanation: The first 1's next greater number is 2; The number 2 can't find next greater number. The second 1's next greater number needs to search circularly, which is also 2.
Example 2:
Input: nums = [1,2,3,4,3] Output: [2,3,4,-1,4]
Constraints:
1 <= nums.length <= 104
-109 <= nums[i] <= 109
下一个更大的元素II。
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
版本一传送门在此。这个题依然是找数组中往右比当前元素更大的元素,但是版本二改了一个设定,需要假设 input 是一个环,也就是说数组最后一个元素在 res 里面的结果很有可能不是-1。
思路依然是单调栈,去看栈顶元素是否比当前元素小,若栈顶元素小则弹出栈并存到结果集 res 里面;若栈顶元素大则还是把当前元素的 index 入栈。单调栈类型的题绝大部分放入栈的都是遍历数组的 index,但是这道题因为是环的关系,所以需要遍历两遍 input 数组,但是注意元素入栈只有一次。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public int[] nextGreaterElements(int[] nums) { 3 int len = nums.length; 4 int[] res = new int[len]; 5 Arrays.fill(res, -1); 6 Stack<Integer> stack = new Stack<>(); 7 for (int i = 0; i < len * 2; i++) { 8 int cur = nums[i % len]; 9 while (!stack.isEmpty() && nums[stack.peek()] < cur) { 10 res[stack.pop()] = cur; 11 } 12 // when loop for the first time 13 if (i < len) { 14 stack.push(i); 15 } 16 } 17 return res; 18 } 19 }
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @return {number[]} 4 */ 5 var nextGreaterElements = function (nums) { 6 let len = nums.length; 7 let res = new Array(len).fill(-1); 8 let stack = []; 9 for (let i = 0; i < nums.length * 2; i++) { 10 let cur = nums[i % len]; 11 while (stack.length > 0 && nums[stack[stack.length - 1]] < cur) { 12 res[stack.pop()] = cur; 13 } 14 if (i < len) { 15 stack.push(i); 16 } 17 } 18 return res; 19 };