Problem

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.

Examples

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]

Solution

Method 1 - Monotonic Decreasing Stack on Indices with Twice the Loop

This is similar to NGR - Nearest Greater Element to Right of every element OR Next Greater Element 1. But we need to use indices as input to the stack and also we have to loop twice:

Code

Java
public int[] nextGreaterElements(int[] nums) {
	int n = nums.length, ans[] = new int[n];

	Arrays.fill(ans, -1);

	Stack<Integer> stack = new Stack<>();
	
	for (int i = 0; i <n * 2; i++) {
		while (!stack.isEmpty() && nums[stack.peek()]<nums[i % n]) {
			ans[stack.pop()] = nums[i % n];
		}
		stack.push(i % n);
	}
	return ans;
}

Complexity

  • ⏰ Time complexity: O(n)
  • 🧺 Space complexity: O(n)