Bootstrap

算法——滑动窗口

  • 滑动:说明这个窗口是移动的,也就是移动是按照一定方向来的。

  • 窗口:窗口大小并不是固定的,可以不断扩容直到满足一定的条件;也可以不断缩小,直到找到一个满足条件的最小窗口;当然也可以是固定大小。

一个小例题引入

【题目】请给出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();          // 如果发现第一个已经在窗口外面了,
;