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)

 

posted @ 2021-11-25 23:09  DidUStudy  阅读(14)  评论(0编辑  收藏  举报