一、题目描述:1004. 最大连续1的个数 III(中等)
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 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。
示例 2:输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
双指针滑动窗口
1、定义左指针left、右指针right,当前left、right直接包含0的个数count。
2、当count < k时,right往右移,如果A[right] == 0 则count++,直到count>k。计算right和left的差值,取最大值。
3、当count > k,left往右移,如果A[left] == 0,则count--。
直到循环right到数字尾部
三、代码
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int left = 0;
int right = 0;
int count = 0;
int count_all = 0;
while(right < A.size())
{
while(right < A.size())
{
//cout<<"righti="<<right<<endl;
//cout<<"count="<<count<<endl;
if(K == 0)
{
while(right < A.size() && left == right && A[left] == 0)
{
left++;
right++;
}
if(right == A.size())
break;
}
if(A[right] == 0)
{
count++;
}
right++;
while(right < A.size() && A[right] == 1)
{
right++;
}
if(count >= K)
{
break;
}
}
//cout<<"righto="<<right<<endl;
count_all = max(count_all,right-left);
//cout<<"count_all="<<count_all<<endl;
while(left < A.size()&&count >=K)
{
if(A[left] == 0)
{
count--;
}
left++;
}
}
return count_all;
}
};
代码二
int longestOnes(vector<int>& A, int K) {
int res = 0;
for (int count = 0, l = 0, r = 0; r < A.size(); ++r) {
if (A[r] == 1) ++count;
while (r - l + 1 - count > K) if (A[l++]) --count;
res = max(res, r - l + 1);
}
return res;
}