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