题目
内容
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
思路
如果不是环形,本质上就是简单的单调栈,而环形,第一时间想到的是,直接把数组长度翻倍,然后把元素复制过去,这就可以了,但看了别人的题解,意识到,环形,也就是取余操作,可以用这个来代替加长数组。
代码
public int[] nextGreaterElements(int[] nums) {
int len = nums.length;
Stack<Integer> ms = new Stack<>();
int[] ans = new int[len];
for(int i=2*len-1;i>=0;i--){
int idx = i%len;
while(!ms.empty()&&ms.peek()<=nums[idx]){
ms.pop();
}
ans[idx] = ms.empty()?-1:ms.peek();
ms.push(nums[idx]);
}
return ans;
}