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
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~