一、题目解析

这是我们结合示例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.

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

被折叠的 条评论
为什么被折叠?



