最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口

1004 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口

题目描述

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

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

题目解析

需要最多变化K个值使连续的子数组长度最大,由题目可以知道,0变为1且这些本改变的0一定是间隔连续的(假设i,j位置上的0变为了1,那么它们之间一定不存在0)。换句话说,就是求一个滑动窗口内包含0个数不超过K个,求这个滑动窗口的最大宽度

题目特征

  1. 求窗口的大小
  2. 窗口是逻辑连续而不是实际连续的
  3. 收缩条件窗口内的0个数超过K

题目解答

class Solution {
    public int longestOnes(int[] A, int K) {
        int sw = 0,len , res,l=0;
        len = A.length;
        for(int r =0 ; r < len ; r++){
            if(A[r] == 0)
                sw++;
            while(sw > K)/*这里进行连续的收缩*/{
                //这里等于跳过1的部分直接到0
                if(A[l] == 0){
                    sw--;
                }
                l++;
            }
            res = Math.max(res,r-l+1);
        }
        return res;
    }
}

转载于:https://www.cnblogs.com/Heliner/p/10971884.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值