C++描述 LeetCode 1004. 最大连续1的个数 III

  大家好,我叫亓官劼(qí guān jié )


给定一个由若干 ​​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. ​1 <= A.length <= 20000​
  2. ​0 <= K <= A.length​
  3. ​A[i]​​​ 为​​0​​​ 或​​1​

解题思路

滑动窗口。设置左右指针​​l和r​​​分别指向当前区间的左右边界,使用​​lsum记录0-l中0的个数,rsum记录0-r中0的个数​​​,则​​rsum-lsum​​​表示当前区间内0的个数,如果​​rsum - lsum - K <= 0​​​则说明当前区间内都可以转为1,更新​​res​​​,否则​​l右移,更新lsum即可​

算法实现

class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int res = 0, len = A.size();
// lsum记录0-l中0的个数,rsum记录0-r中0的个数
int lsum = 0, rsum = 0, l = 0;
for(int r = 0; r < len ; r++){
rsum = rsum + 1 - A[r];
while(rsum - lsum - K > 0){
// 当前区间有多余的0时,l右移
lsum = lsum + 1 - A[l++];
}
res = max(res,r-l+1);
}
return res;
}
};