【题目】
给定一个数组 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; } }
标签:59,nums,int,最大值,Offer,new,滑动,窗口 From: https://www.cnblogs.com/End1ess/p/17354704.html