leetcode原题:
给定一个数组 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 ≤ 输入数组的大小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0 || k == 0) return new int[0]; Deque<Integer> deque = new LinkedList<>(); int[] res = new int[nums.length - k + 1]; // 未形成窗口 for(int i = 0; i < k; i++) { while(!deque.isEmpty() && deque.peekLast() < nums[i]) deque.removeLast(); deque.addLast(nums[i]); } res[0] = deque.peekFirst(); // 形成窗口后 for(int i = k; i < nums.length; i++) { if(deque.peekFirst() == nums[i - k]) deque.removeFirst(); while(!deque.isEmpty() && deque.peekLast() < nums[i]) deque.removeLast(); deque.addLast(nums[i]); res[i - k + 1] = deque.peekFirst(); } return res; } }
作者:jyd
链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-i-hua-dong-chuang-kou-de-zui-da-1-6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
提取知识点
关键词:滑动窗口,取最大值
-
原理就是通过队列将数据一个个压进去,如果后面一个数大于队列中的数(从队尾开始比较,循环比较),就将对应的队列中的数去掉。反之,则直接将该值压入。
-
而滑动窗口的最大值就是队列中现存的第一个值。
-
用Deque来实现能非常方便的取值比较
纯属个人总结,为了方便日后信息查找并提取,归纳的信息可能不太适合大众阅读。