leetcode 503 循环数组 单调栈

本题的循环数组,之前没听过,这次学到了。就是首尾相接的数组,并不是数组内部循环。而这个题实现方法为单调栈,若前面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
上一篇:503. 下一个更大元素 II


下一篇:RequireJs 依赖管理使用