最大连续1的个数★
【题目】给定一个二进制数组, 计算其中最大连续1的个数。
【示例】
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
【解题思路】
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int count = 0, max = 0;
for(int x : nums) {
if(x == 1) {
count++;
}else {
max = Math.max(max, count);
count = 0;
}
}
return Math.max(max, count);
}
}
最大连续1的个数Ⅱ★★
【题目】给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。
【示例】
输入:[1,0,1,1,0]
输出:4
解释:翻转第一个 0 可以得到最长的连续 1。
当翻转以后,最大连续 1 的个数为 4。
【解题思路】
class Solution {
int findMaxConsecutiveOnes(int[] nums) {
int le = 0, ri = 0;
int res = 0, zero = 0;
while(ri < nums.length) {
if(nums[ri++] == 0) zero++;
while(zero > 1) {
if(nums[le++] == 0) zero--;
}
res = Math.max(res, ri - le);
}
return res;
}
}
最大连续1的个数Ⅲ★★
【题目】给定一个由若干 0
和 1
组成的数组 A
,我们最多可以将 K
个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
【示例】
输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
【解题思路】双指针+滑动窗口
class Solution {
public int longestOnes(int[] A, int K) {
int le = 0, ri = 0;
int res = 0, zero = 0;
while(ri < A.length) {
if(A[ri++] == 0) zero++;
while(zero > K) {
if(A[le++] == 0) zero--;
}
res = Math.max(res, ri - le);
}
return res;
}
}