题目描述
滑动窗口的长度是k,每次右移一位,需要返回窗口中的最大值
基本分析
- 维护值还是索引?索引可以判断队头是否离开,是更好的选择
- 0-k-1的窗口怎么维护?只是执行while弹出队尾+追加i的操作,不考虑删除队头
- k-n-1的遍历中注意什么?队尾中弹出<nums[i]的索引;追加i;while弹出滑动出去的队头;追加答案。
代码
| class Solution: |
| def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: |
| n = len(nums) |
| q = deque() |
| |
| ans = [] |
| for i in range(k): |
| while q and nums[i] > nums[q[-1]]: |
| q.pop() |
| q.append(i) |
| ans.append(nums[q[0]]) |
| |
| for i in range(k, n): |
| while q and nums[i] > nums[q[-1]]: |
| q.pop() |
| q.append(i) |
| while q[0] <= i - k: |
| q.popleft() |
| ans.append(nums[q[0]]) |
| |
| return ans |
总结
- 为什么判断索引和i-k的关系?结尾是i,长度是k时,开始索引是i-k+1
基本分析
- 还有什么方法能维护区间内的最大值?优先队列
- 怎么保证队列的头在始终是在区间内的?队里面放值-索引的元组,不断查看队头索引和i-k的关系
代码
| class Solution: |
| def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: |
| n = len(nums) |
| q = [(-nums[i], i) for i in range(k)] |
| heapq.heapify(q) |
| ans = [] |
| ans.append(-q[0][0]) |
| |
| for i in range(k, n): |
| heapq.heappush(q, (-nums[i], i)) |
| while q[0][1] <= i - k: |
| heapq.heappop(q) |
| ans.append(-q[0][0]) |
| |
| return ans |
总结
- python默认是小根堆,为了实现大根堆怎么办?把值转化为负的存取
- 堆的一些基本操作?heapq.heapify(q), heapq.heappush(q, (-nums[i], i)), heapq.heappop(q)
待补充
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现