239. 滑动窗口最大值
描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
链接
239. 滑动窗口最大值 - 力扣(LeetCode) (leetcode-cn.com)
解法
解法一:单调队列,来源于 剑指offer
1 class Solution { 2 public int[] maxSlidingWindow(int[] nums, int k) { 3 if (nums.length == 0) return nums; 4 // 窗口个数 5 int[] res = new int[nums.length - k + 1]; 6 LinkedList<Integer> queue = new LinkedList<>(); 7 8 // 遍历数组中元素,right表示滑动窗口右边界 9 for(int right = 0; right < nums.length; right++) { 10 // 如果队列不为空且当前考察元素大于等于队尾元素,则将队尾元素移除。 11 // 直到,队列为空或当前考察元素小于新的队尾元素 12 while (!queue.isEmpty() && nums[right] >= nums[queue.peekLast()]) { 13 queue.removeLast(); 14 } 15 16 // 存储元素下标 17 queue.addLast(right); 18 19 // 计算窗口左侧边界 20 int left = right - k +1; 21 // 当队首元素的下标小于滑动窗口左侧边界left时 22 // 表示队首元素已经不再滑动窗口内,因此将其从队首移除 23 if (queue.peekFirst() < left) { 24 queue.removeFirst(); 25 } 26 27 // 由于数组下标从0开始,因此当窗口右边界right+1大于等于窗口大小k时 28 // 意味着窗口形成。此时,队首元素就是该窗口内的最大值 29 if (right +1 >= k) { 30 res[left] = nums[queue.peekFirst()]; 31 } 32 } 33 return res; 34 } 35 36 }
题解链接
剑指 Offer 59 - I. 滑动窗口的最大值(单调队列,清晰图解) - 滑动窗口的最大值 - 力扣(LeetCode) (leetcode-cn.com)