题目
- 给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。
- 示例 1:
输入:[1,0,1,1,0]
输出:4 - 解释:翻转第一个 0 可以得到最长的连续 1。当翻转以后,最大连续 1 的个数为 4。
- 注:
输入数组只包含 0 和 1.
输入数组的长度为正整数,且不超过 10,000 - 进阶:如果输入的数字是作为 无限流 逐个输入如何处理?换句话说,内存不能存储下所有从流中输入的数字。您可以有效地解决吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = 0;
int k =1;//最多将 1 个 0 翻转为 1
//双指针从零开始遍历
for (int left = 0, right = 0; right < nums.length; right++) {
//当右指针的数组元素为零时判断K;
if (nums[right] == 0) {
//当k==0,此时左指针左滑到跳过它的一个零为止
if (k == 0) {
//跳过满足1的情况
while (nums[left] == 1) {
left++;
}
//跳过第一个零的情况,此时满足了k==0
left++;
} else {
//K不等于0则k--;
k--;
}
}
//最大值取左右区间的最大值
max = right - left + 1 > max ? right - left + 1 : max;
}
//返回max;
return max;
}
}
思路
-
使用双指针 left 和 right 指代窗口的左右边界,移动 right 指针遍历整个数组,同时维护一个变量 max,每次 right 移动计算一次当前的最大值。
-
分析:分为以下几种情况:
-
当 A[right] = 1 时,left 不变,right 继续移动
-
当 A[right] = 0 时,0 的数量在 K 的范围内,left 不变,right 继续移动0 的数量 > K,
-
当 A[left] == 0 时,即 left 指向了一个零,只需要 left 右移一格,就可以减少一个零
-
当 A[left] == 1 时,即此时窗口内包了 K 个零,需要先移动至下个零,再右移一格才能减少一个零
-
本题是1004题 最大连续1的个数 III中当K=1时的特殊情况
-