滑动窗口思路精髓总结

滑动窗口首先定义
int l=0,r=0;
然后r一定每次循环都要往后移一位,至于左窗口,我们在内部考虑,需要左窗口移动的时候,我们在一次循环内,直接移动到可以的位置,然后再计算,r++;
while(r<len){
   count+=arr[r];
    while(不满足条件的时候){
          l++;
          count-=arr[l];
    }
    计算;
    r++;        
}
总而言之,没次进来需要加arr[r],然后对于窗口条件不满足需要移动左边界的,我们在一个while内直接搞完,最后r++;
就是每次循环一次,r一定++了一次。

实例:

  LC1004:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。

  返回仅包含 1 的最长(连续)子数组的长度。

 public int longestOnes(int[] A, int K) {
        int res=0,l=0,r=0;
        while(r< A.length){
            if(A[r]==0){
                if(K>0){
                    K--;
                }
                else{
                    res=res>(r-l)?res:(r-l);
                    while(A[l++]==1);
                }
            }
            r++;
        }
        res=res>(r-l)?res:(r-l);
        return res;
    }
posted @ 2020-08-24 16:25  程序杰杰  阅读(267)  评论(0编辑  收藏  举报