Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. 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, output -1 for this number.
Example 1:
Input:
[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.
因为有可能有重复的number,所以不能用Map store result.
stack 放 单调递减的subarray的 index 可以解决问题
public class Solution {
public int[] nextGreaterElements(int[] nums) {
if(nums == null || nums.length == 0) {
return new int[0];
}
int[] result = new int[nums.length];
Deque<Integer> stack = new LinkedList<Integer>();
for(int i = 0; i < nums.length; i++) {
result[i] = -1;
}
for(int i = 0; i < nums.length * 2; i++) {
int num = nums[i % nums.length];
while(!stack.isEmpty() && nums[stack.peekFirst()] < num ) {
result[stack.removeFirst()] = num;
}
if (i < nums.length) {
stack.addFirst(i);
}
}
return result;
}
}