【剑指 Offer】 59 - I. 滑动窗口的最大值
【题目】
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
提示:
你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length。
注意:本题与主站 239 题相同:https://leetcode-cn.com/problems/sliding-window-maximum/
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
【思想】
使用一个单调队列,只会保存长度为k的,单调递减的数,同时可以保证最大的那个数出队,如果遇到比最大的数还大的,那么之前的数全部出队。
【代码】
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length==0||k==0){ return new int[0]; } Deque<Integer> deq = new LinkedList<>(); int[] res = new int[nums.length-k+1]; // 初始化队列,找到前k个数可以形成单调队列的数 for(int i=0;i<k;i++){ while(!deq.isEmpty()&&deq.peekLast()<nums[i]){ deq.removeLast(); } deq.addLast(nums[i]); } res[0] = deq.peekFirst(); // 从第k个数开始,遍历数组 for(int i=k;i<nums.length;i++){ //如果遇到了当前最大数 就将最大数出队 if(deq.peekFirst()==nums[i-k]){ deq.removeFirst(); } // 如果遇到不单调递减的情况,先将小的数出队 while(!deq.isEmpty()&&deq.peekLast()<nums[i]){ deq.removeLast(); } // 加入当前遍历的数 deq.addLast(nums[i]); // 更新结果列表 res[i-k+1] = deq.peekFirst(); } return res; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现