题目
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.
Note: The length of given array won’t exceed 10000.
单调栈
本题除了比较位置右边的元素外,还可看作是一个循环数组进行比较,就是说结果也可能出现在其左边的位置。对于循环数组,可以使用求模的方法进行处理,其他的原理不变。
python代码
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
if not nums:
return []
n = len(nums)
res = [0]*n
s = []
for i in range(2*n-1,-1,-1):
while s and s[-1]<=nums[i%n]:
s.pop()
if not s:
res[i%n] = -1
else:
res[i%n] = s[-1]
s.append(nums[i%n])
return res