C++描述 LeetCode 1004. 最大连续1的个数 III 大家好,我叫亓官劼(qí guān jié ) 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值
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。
提示:
解题思路
滑动窗口。设置左右指针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;
}
};