239. 滑动窗口最大值
- 题目链接
- 解题思路:使用一个队列,队头的就是当前窗口内的最大值。队头到队尾是依次减小的。队中的其他元素是【最大值候选者】。假设当前窗口内值为
4, 3, 1, 2,那么队列就是4, 3, 2,为什么?4可能是最大值吗?可能,现在就是最大值。3可能是最大值吗?可能,如果把4淘汰了,就可能是最大值了。1可能是最大值吗?不可能,因为窗口大小为4,1后面有一个2,无论如何,最大值都不可能是1。2可能是最大值吗?可能,因为后面的数据状况未知
-
- 我们可以这样思考:从左往右遍历一个数
nums[i],它可能是【最大值候选者】吗?肯定可能!即使nums[i]是最小值,如果nums[i]前面的数全部移出窗口后,那么nums[i]就有可能是最大值。 - 当遍历到
nums[i + 1]时,如果发现前面的数,小于nums[i + 1],那么就要把【这些数】从队列中移出去。为什么?因为nums[i + 1]的【生存时间】更长,并且nums[i + 1]数值更大,【这些数】无论如何都不可能是最大值了
- 我们可以这样思考:从左往右遍历一个数
- 代码
class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: d = deque() for i in range(k): # 队头就是当前最大的元素 while d and d[-1] < nums[i]: d.pop() d.append(nums[i]) ans = [] # 先收集第一个答案 ans.append(d[0]) for i in range(k, len(nums)): # i - k 不在范围 是否要移出队列 if nums[i - k] == d[0]: d.popleft() while d and d[-1] < nums[i]: d.pop() d.append(nums[i]) ans.append(d[0]) return ans

浙公网安备 33010602011771号