题目链接
题目描述
给定一个二进制数组 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^5nums[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;
}
}
该博客介绍了如何使用滑动窗口法解决LeetCode上的一个问题——在给定二进制数组nums中,找到最多可以翻转一个0的情况下,数组中连续1的最大个数。通过迭代数组,动态维护窗口内0的个数,并适时移动左边界,找到最长子数组。最终,博主提供了AC代码实现这一算法。
668

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



