题目链接
题目描述
给定一个二进制数组 nums
,如果最多可以翻转一个 0
,则返回数组中连续 1
的最大个数。
示例 1:
输入:nums = [1,0,1,1,0]
输出:4
解释:翻转第一个 0 可以得到最长的连续 1。
当翻转以后,最大连续 1 的个数为 4。
示例 2:
输入:nums = [1,0,1,1,0,1]
输出:4
提示:
1 <= nums.length <= 10^5
nums[i]
不是0
就是1
.
进阶:如果输入的数字是作为 无限流 逐个输入如何处理?换句话说,内存不能存储下所有从流中输入的数字。您可以有效地解决吗?
解题思路
在最多可以翻转一个0的情况下寻找数组nums中连续1的最大个数,等价于寻找数组nums中的最多包含1个0的最长子数组的长度
滑动窗口法
- left:控制左边界
- right:控制右边界
- count0表示滑动窗口中0的数量
- 对于每一个右边界,如果
nums[right] == 0
,那么count0++
- 如果
count0 > 1
,则当nums[left] == 0
时将count0--
,否则count0
不变,然后将left++
,直到count0 <= 1
- 如果
- 当前滑动窗口
[left,riht]
中的子数组为最多包含一个0的子数组,其长度为right - left + 1
,使用当前子数组的长度更新子数组的最大长度
AC代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int left = 0;
int right = 0;
int ans = 0;
int count0 = 0;
for (right = 0; right < nums.length; right++) {
if (nums[right] == 0) {
count0++;
}
while (count0 > 1) {
if (nums[left] == 0) {
count0--;
}
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}