力扣-503-循环数组中比当前元素大的下一个元素

题目:
503. Next Greater Element II(medium)


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

1
2
3
4
5
6
示例 1:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

注意: 输入数组的长度不会超过 10000。


解题思路:
这个题看起来好像和739.数组中元素与下一个比它大的元素之间的距离很像,但是本题数组是循环的,而且返回的下一个更大的元素。

循环数组的实现可以用扫描两边数组长度来实现,但是只在i < n 时数组元素才进栈。
栈pre把数组中的数存起来,如果出现了当前遍历的元素比栈顶元素大,则说明栈顶元素的下一个更大的数就是当前元素。


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Java:
public int[] nextGreaterElements(int[] nums){
int n = nums.length;
int[] next = new int[n];
Arrays.fill(next,-1);
Stack<Integer> pre = new Stack<>();
for(int i = 0; i < n*2 ; i++){
int num = nums[i%n]; //这步相当的关键!! 不然会出现数组下标越界

while(!pre.isEmpty() && nums[pre.peek()] < num){
next[pre.pop()] = num;
}
if(i < n){
pre.push(i);
}
}
return next;
}