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;


    }
}

results matching ""

    No results matching ""