滑动:说明这个窗口是移动的,也就是移动是按照一定方向来的。
窗口:窗口大小并不是固定的,可以不断扩容直到满足一定的条件;也可以不断缩小,直到找到一个满足条件的最小窗口;当然也可以是固定大小。
一个小例题引入
【题目】请给出n个连续元素的最大和
输入:[-3, 3, 1, -3, 2, 4, 7] n=3
输出:13
如下图所示,设定滑动窗口(window)大小为 3,当滑动窗口每次划过数组时,计算当前滑动窗口中元素的和,得到结果 res。
在这道题中,n就是滑动窗口的大小,通过窗口向右滑动,将窗口里的3个数字相加得到一个连续数的和值,和上一个窗口的和值比较,不断更新最大的和值,最后得到结果,这道题的窗口是固定的,窗口长度也可以是动态的。
class Solution {
public static int[] maxSlidingWindow(int[] nums, int k) {
int right =0;
int[] res = new int[nums.length -k +1];
int index=0;
LinkedList<Integer> list = new LinkedList<>(); // 开始构造窗口
while (right < nums.length) { // 这里的list的首位必须是窗口中最大的那位
while (!list.isEmpty() && nums[right] > list.peekLast()) {
list.removeLast();
} // 不断添加
list.addLast(nums[right]);
right++; // 构造窗口完成,这时候需要根据条件做一些操作
if (right >= k){
res[index++]=list.peekFirst(); // 如果发现第一个已经在窗口外面了,