边工作边刷题: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
原文地址:https://www.cnblogs.com/absolute/p/5690337.html