给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入: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
示例 2:
输入:nums = [1], k = 1
输出:[1]
提示:
1 <= nums.length <= 10^5
-10^4<= nums[i] <= 10^4
1 <= k <= nums.length
该大题原理与力扣-->#剑指 Offer 59 - II. 队列的最大值-->队列-中等(双端队列)大致相同,其他解释在对应代码中。
执行结果:通过
执行用时:10 ms, 在所有 Java 提交中击败了85.60%的用户
内存消耗:48.4 MB, 在所有 Java 提交中击败了50.70%的用户
通过测试用例:18 / 18
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {//滑动窗口
int[] result=new int[nums.length-k+1];//记录每个窗口中的最大值 窗口的个数为n-k+1
if(k == 0) return new int[0];
Deque<Integer> deque=new ArrayDeque<>();//使用队列记录最大值及候选值
//未形成窗口的时候
for (int i=0;i<k;i++){
//每次都要取队尾与新元素比较,如果队尾元素小,则一直删除队尾
// (因为比最后一个值小的他们已经没有利用价值了)
while (!deque.isEmpty() && nums[i]>deque.peekLast()){
deque.pollLast();
}
deque.offerLast(nums[i]);
}
//此时第一个窗口形成
result[0]=deque.peekFirst();//第一次保留到一个窗口中的最大值,即deque的对头元素
//窗口已形成
for (int i=k;i<nums.length;i++){
//删除num[i-k] 插入num[i]
if (nums[i-k]==deque.peekFirst()){//如果删除的是最大值-出队
deque.pollFirst();
}
//增加
while (!deque.isEmpty() && nums[i]>deque.peekLast()){
deque.pollLast();
}
deque.offerLast(nums[i]);
result[i-k+1]=deque.peekFirst();
}
return result;
}
}
平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!