欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

滑动窗口

程序员文章站 2022-06-01 22:49:59
...

滑动窗口

滑动窗口可以看成数组中框起来的一个部分。在一些数组类题目中,我们可以用滑动窗口来观察可能的候选结果。当滑动窗口从数组的左边滑到了右边,我们就可以从所有的候选结果中找到最优的结果。

例题

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

思路

对于这道题来说,数组就是正整数序列 [1, 2, 3, \dots, n]1,2,3,…,n]。我们设滑动窗口的左边界为 ii,右边界为 jj,则滑动窗口框起来的是一个左闭右开区间 [i, j)[i,j)。注意,为了编程的方便,滑动窗口一般表示成一个左闭右开区间。在一开始,i=1, j=1i=1,j=1,滑动窗口位于序列的最左侧,窗口大小为零。
滑动窗口

滑动窗口的重要性质是:窗口的左边界和右边界永远只能向右移动,而不能向左移动。这是为了保证滑动窗口的时间复杂度是 O(n)O(n)。如果左右边界向左移动的话,这叫做“回溯”,算法的时间复杂度就可能不止 O(n)O(n)。

代码

public int[][] findContinuousSequence(int target) {
        int i = 1;//左边界
        int j = 1;//右边界
        int count = 0;//数字和 判断和给出的target是否相等
        ArrayList<int []> list = new ArrayList<>();//存放数组的集合
        while(i <= target/2) {
            if(count < target) {//小于 边界右移
                count+=j;
                j++;
            }else if(count > target) {//大于 边界左移
                count-=i;
                i++;
            }else {//等于 存入list 且左边界右移
                int arr[] = new int[j - i];
                for(int k = i;k < j;k++) {
                    arr[k - i] = k;
                }
                list.add(arr);
                count -= i;
                i++;
            }
        }
        return list.toArray(new int[list.size()][]);//返回一个二维数组 
 }
相关标签: java 算法