Problem description:

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.

Example 1:

1
2
3
4
5
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:

1
2
Input: nums = [1,2,3,4,3]
Output: [2,3,4,-1,4]

Constraints:

  • 1 <= nums.length <= 104
  • 109 <= nums[i] <= 109

Solution:

We want the next greater element in the same array

Loop twice could do so

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
stk = []
res = [-1] * len(nums)

for idx in range(len(nums)*2):
i = idx % len(nums)
while stk and nums[stk[-1]] < nums[i]:
top = stk.pop()
res[top] = nums[i]
stk.append(i)
return res

time complexity: $O()$
space complexity: $O()$
reference:
related problem: