滑动窗口-1004.最大连续1的个数III

一、题目解析

 

这是我们结合示例1分析的过程,在过程中我们发现在计算长度后如果不对反转为1的0进行还原,将会影响其他的长度结果。所以我们可以用一个计数器来记录0的个数,这样就省去了翻转在还原的操作。

二、算法解析

经过上面的分析,我们将问题转化为找出最长的子数组,且0的个数不超过个。

解法1:暴力枚举+zero计数器

通过移动或固定左端点,枚举出所有子数组长度且0的个数不超过k。 

解法2:滑动窗口优化

1.双指针:left=0,rigth=0;还有zero计数器。

2.进窗口:right右移,如果是1,无视,如果是0,zero计数器+1;

3.判断:zero是否大于k

 出窗口:移动left,如果是1,无视,如果是0,zero计数器-1;

循环重复这两个过程

4.更新结果:当zero<k时,我们就可以更新结果,用len来记录。

老规矩,根据上面的思路去自己实现代码,链接:1004. 最大连续1的个数 III - 力扣(LeetCode) 

三、代码示例

 

为什么会把更新结果放在最后呢?按照我们的判断当进入while循环时可以先保留此时的len值,然后在出窗口,继续更新len。但是看看下面的报错的样例,我们可以分析一下,放在while内,还是外面。 

 

 

 如果在循环内,len=1,如果在最后,len=3.

看到最后,如果对您有所帮助,还请留下一个免费的赞,我们下期再见! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值