题目
给定一个由若干 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。
提示:
1 <= A.length <= 20000
0 <= K <= A.length
A[i] 为 0 或 1
滑动窗口:每次判断窗口内0的个数来移动左指针。接着右指针右走一步
滑动窗口,最后输出窗口大小的最大值。
- 每次都根据窗口内0的个数是否超过k,来判断是否要调整左指针
- (如果超过k,则将左指针移到窗口内第一个0的右边)。
- 记录此时的窗口大小,并更新最大值。
- 接着右指针向右走一步。
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
/*
滑动窗口,最后输出窗口大小的最大值。
每次都根据窗口内0的个数是否超过k,来判断是否要调整左指针(如果超过k,则将左指针移到窗口内第一个0的右边)。记录此时的窗口大小,并更新最大值。接着右指针向右走一步。
*/
int l = 0, r = 0; //左右指针
int count = 0; // 窗口内0的个数
int anws = 0;
while( r < A.size() ){
//更新窗口内0的个数
if( A[r] == 0 ){
count++;
//左指针移到第一个0的右边
while( count > K ){
if( A[l] == 0 ){
count--;
}
l++;
}
}
anws = max( anws, r-l+1 );
r++;
}
return anws;
}
};