给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:注意思路使用双端降序队列
//Deque双端队列 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len = nums.length; int[] res = new int[len - k + 1]; //或Deque LinkedList<Integer> queue = new LinkedList<>(); for(int i = 0; i < len; i++) { //当最后的元素小于数组当前元素,弹出最后的元素 while(!queue.isEmpty() && nums[i] >= nums[queue.peekLast()]) { queue.pollLast(); } queue.addLast(i); //当最前面的位置不在k个元素的范围时,从前面出队 //小于i-k时 if(queue.peekFirst() <= i - k) { queue.pollFirst(); } //当元素达到k个时,将队头元素加入数组 if(i - k + 1 >= 0) { //加入时不出队 res[i - k + 1] = nums[queue.peekFirst()]; } } return res; } } class Solution { /** 注意尾部头部什么时候移除、结果添加 2循环1判断 */ public int[] maxSlidingWindow(int[] nums, int k) { int len = nums.length; Deque<Integer> queue = new LinkedList<>(); int[] res = new int[len - k + 1]; for(int i = 0; i < len; i++) { //元素移除 while(!queue.isEmpty() && nums[i] >= nums[queue.peekLast()]) { queue.pollLast(); } //添加元素的函数 queue.offer(i); //移除头元素,while,当头的位置不在k个区间时 while(queue.peekFirst() <= i - k) { queue.pollFirst(); } //添加元素到res,if,当窗口长度达到k个时,☆☆☆☆ if(i - k + 1 >= 0) { res[i - k + 1] = nums[queue.peekFirst()]; } } return res; } }