给定一个由若干 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 <= 200000 <= K <= A.lengthA[i] 为 0 或 1
解答
滑动窗口,记录窗口内0的个数,只有当0的个数小于等于K时,窗口才合法。
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int left = 0;
int right = 0;
int cnt = 0;
int result = 0;
while(right < A.size()){
if(A[right] == 1 || (A[right] == 0 && K > cnt)){
if(A[right] == 0){
cnt++;
}
result = max(result, right - left + 1);
right++;
}
else{
while(cnt >= K){
if(A[left] == 0){
cnt--;
}
left++;
}
}
}
return result;
}
};
参考评论区,实际上我们并不需要把最长的那个窗口左右区间都求出来,有如下简短的写法:
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int l = 0, r = 0;
while(r < A.size()){
if(A[r++] == 0){
K--;
}
if(K < 0){
if(A[l++] == 0){
K++;
}
}
}
// 由于区间长度单调不减,所以最后返回的就是最长区间长度
return r - l;
}
};

该博客介绍了如何解决寻找数组中最多可以改变为1的0,以形成最长连续1子数组的问题。通过使用滑动窗口策略,并在窗口内计数0的数量,当0的数量不超过K时,窗口被视为有效。博客提供了示例和提示来帮助理解解决方案,并指出无需找到最长窗口的精确边界,只需关注窗口内0的数量是否符合要求。

589

被折叠的 条评论
为什么被折叠?



