剑指 Offer 59 - I. 滑动窗口的最大值
Posted 不吐西瓜籽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 59 - I. 滑动窗口的最大值相关的知识,希望对你有一定的参考价值。
算法记录
LeetCode 题目:
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
说明
一、题目
也就是一个矩形框在移动,然后每次输出框中的最大值,知道抵达数组的尾部。
二、分析
- 最笨的方法可以直接保留当前框中的最大值的坐标,每次框移动时判断当前的最大值会不会移动出界。
- 如果会出界就再次查找矩形中的最大值,否则就比较即将纳入矩形的数据会不会比最大值大,是的话就改变最大值的坐标,否则不变动。
- 我们这里采用队列维护最大值地址的方式:
- 如果队列中的元素数量大于
K
就将头元素出队(这里的元素数量指的是即将入队的元素地址与头部元素的地址的差值大于了K
). - 如果当前队列的尾部元素小于了即将入队的元素,就直接将其剥离出队,因为这两个元素如果存在一个队列中,小的元素永远也不会输出贡献,也就是无用的元素。
- 最后是只有队列至少移动
K
个数才能输出,因为矩形边界就是这么大。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null) return new int[0];
List<Integer> re = new ArrayList();
Deque<Integer> queue = new LinkedList();
int len = 0;
while(len < nums.length) {
if(!queue.isEmpty() && queue.getFirst() + k <= len) queue.pollFirst();
while(!queue.isEmpty() && nums[len] > nums[queue.getLast()]) queue.pollLast();
queue.offerLast(len);
len++;
if(len >= k) re.add(nums[queue.getFirst()]);
}
return re.stream().mapToInt(Integer::valueOf).toArray();
}
}
总结
熟悉双端队列的使用方法。
以上是关于剑指 Offer 59 - I. 滑动窗口的最大值的主要内容,如果未能解决你的问题,请参考以下文章
每日一题 - 剑指 Offer 59 - I. 滑动窗口的最大值