滑动窗口是什么?
滑动窗口是一种想象出来的数据结构:
滑动窗口有左边界L和右边界R
在数组或者字符串或者一个序列上,记为S,窗口就是S[L..R]这一部分
L往右滑意味着一个样本从左侧出了窗口,R往右滑意味一个样本进了窗口
L和R都只能往右滑并且L<=R
题目一:
假设一个固定大小为W的窗口,依次划过arr,返回每一次滑动窗口的最大值
例如,arr=[4,3,5,4,3,3,6,7], W=3
返回:[5,5,5,4,6,7]
思路:维护一个双端队列,队列的数据保证严格的从大到小排列(不能包含等于),每次取最大值,只需要取第一个即可。
如果队列的数据,和当前索引超过窗口,必须淘汰队列中的最大值。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length < k || k < 1) {
return new int[0];
}
int len = nums.length;
LinkedList<Integer> linkedList = new LinkedList();
int[] res = new int[len - k + 1];
int index = 0;
for (int i = 0; i < len; i++) {
while (!linkedList.isEmpty() && nums[linkedList.peekLast()] <= nums[i]) {
linkedList.pollLast();
}
linkedList.addLast(i);
if (linkedList.peekFirst() == i - k) {
linkedList.pollFirst();
}
if (i >= k - 1) {
res[index++] = nums[linkedList.peekFirst()];
}
}
return res;
}
}