本题的循环数组,之前没听过,这次学到了。就是首尾相接的数组,并不是数组内部循环。而这个题实现方法为单调栈,若前面N个都是递减的,那他们的最大数只有一个,没有必要O(N方)。循环数组只要遍历两次即可。
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
ret = [-1 for _ in nums]
ct, i = 0, 0
stack = []
while ct < 2*len(nums):
tmp = []
while stack and nums[i] > stack[-1][0]:
tmp.append(stack.pop())
for _, j in reversed(tmp):
ret[j] = nums[i]
stack.append((nums[i], i))
i = (i+1)%len(nums)
ct += 1
return ret
上述代码是可以优化的,比如,只存储索引。并利用索引赋值。第二个可以快的点是,第二遍遍历的时候,所有索引都已经压进栈了,所以没有必要再压第二遍。
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
ret = [-1 for _ in nums]
stack = []
for i, num in enumerate(nums):
while stack and num > nums[stack[-1]]:
ret[stack.pop()] = num
stack.append(i)
for i, num in enumerate(nums):
while stack and num > nums[stack[-1]]:
ret[stack.pop()] = num
return ret