• 边工作边刷题:70天一遍leetcode: day 61-4


    Sliding Window Maximum

    要点:这题O(nlgk)的算法很简单,就是用个max heap,当然还有O(n)的算法。具体的就是用deque,deque中maintain从大到小的顺序。显然,deque头就是每个sliding window的max值。这里的问题是移动到下一个元素的时候如何maintain:

    • 从deque尾删除元素,新元素从deque尾入:如果新元素大于队尾,显然无论其是否为max,因为新元素在右边,队尾的元素就没用了
    • 从deque头删除元素:如果队头的值超过了sliding window,删除掉。注意出界的元素不需要立即删除,直到其可能成为max的的时候。所以这个删除是loop
    • deque存的是index:类似题既需要index又需要value的,只要value不变,就存index就可以了

    错误点:

    • 不需要单独先push前k个,只需要i没到前k个时候不push到res即可
    class Solution(object):
        def maxSlidingWindow(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: List[int]
            """
            deque = []
            res = []
            for i in xrange(len(nums)):
                while deque and nums[deque[-1]]<nums[i]:
                    deque.pop()
                while deque and deque[0]<=i-k:
                    deque.pop(0)
                
                deque.append(i)
                if i>=k-1:
                    res.append(nums[deque[0]])
            return res
    
  • 相关阅读:
    写多了博客,就想沽名钓誉
    中医与DBA
    关于OneProxy推广
    使用分布式数据库集群做大数据分析之OneProxy
    不能使用tpcc-mysql测试OneProxy
    下三滥
    建立自己的客户关系网
    编译spock proxy
    胆子还是小了
    主流语言的异常处理对比
  • 原文地址:https://www.cnblogs.com/absolute/p/5690337.html
Copyright © 2020-2023  润新知