C++描述 LeetCode 1004. 最大连续1的个数 III
大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页
本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
若需联系博主,可以联系本人微信:qiguanjie2015
给定一个由若干 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
解题思路
滑动窗口。设置左右指针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;
}
};