题目描述
给定一个由若干 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
典型的滑动窗口问题
和 LC上424. 替换后的最长重复字符等问题类似,借助left和right双指针来实现滑动窗口的右移。
总结下就是:移动窗口,定义left和right两个变量作为滑动窗口的左右边界,如果A[right] == 1 ,那么right++,向右滑动,
如果 A[right] == 0, 先判断下K是否为0,不是的话就将K-1,窗口再右移一格,之后判断A[left] 是否等于0,如果等于0,那么left++,K++,不等于0,left++。
最后定义一个变量,每次记录right - left的最大值,也就是记录窗口的最大长度,就可以得出最长连续1的长度
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int res = 0;
int left = 0, right = 0, len = A.size();
while(right < len) {
if(A[right]) {
right++;
} else {
if(K) {
K--;
right++;
} else if(A[left] == 0) {
K++;
left++;
} else if(A[left] == 1) {
left++;
}
}
res = max(res, right - left);
}
return res;
}
};