剑指 Offer 59 - I. 滑动窗口的最大值
题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 困难

方法:单调递减的双端队列 时间复杂度O(n) 空间复杂度O(n)
如果每次挪动滑动窗口都遍历去找最值,过于耗时,因此维护一个单调递减的双端队列
移动窗口时,当移除的数等于队首时,需要将队首出队列
若新入队的数大于队尾,则需将队尾出队,继续判断,直至小于队尾或队空,入队 ( 因为新入队的数相对于原先在队列中的数在滑动窗口中的位置靠后,即比先入队的数晚出窗口,故不用担心 )
算法流程就是形成窗口前加入队列,形成窗口后开始将队首加入res
def maxSlidingWindow(nums, k): """ :type nums: List[int] :type k: int :rtype: List[int] """ if nums == [] or k == 0: return [] deque = [] for i in range(k): while deque and deque[-1] < nums[i]: deque.pop() deque.append(nums[i]) res = [deque[0]] for i in range(k,len(nums)): if deque[0] == nums[i - k]: deque.pop(0) while deque and deque[-1] < nums[i]: deque.pop() deque.append(nums[i]) res.append(deque[0]) return res

浙公网安备 33010602011771号