一.题目
习题链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

二.题目讲解
给定只包含0和1的数组,最多可以把 k 个 0 变成 1,求:变换之后,最长的连续 1 子数组有多长。
核心:找一段子区间,区间里面
0的数量 ≤ k,求这个区间的最大长度。 把区间里最多 k 个 0 翻转成 1,整段就全部是连续 1。
示例 1: nums = [1,1,1,0,0,0,1,1,1,1,0], k=2 允许翻转 2 个 0。 选窗口:[1,1,1,0,0,1],里面有 2 个 0,刚好可以翻转,长度 = 6,就是答案。
注:这里的k是最多能翻多少个,可以不翻也可以翻任意一个只要不超过k就行
三.算法原理讲解
通过读这道题加上理解,我们可以把这道题转化为:寻找一个子数组,里面0的个数不超过给定的k值,这样就可以找到最长的连续子数组了
解法一:暴力枚举
跟之前的思想一样,定着一个数然后不断往后遍历,找到最大的子数组后,让left++,让right拐回来继续重复相同的步骤,可以发现这样做会超时

解法二:滑动窗口
就是在暴力枚举的基础上优化,不让right回来,让它呆在那里,直到子数组中0的个数减少到k值一下,就可以继续向前移动然后判断,重复之前过程即可
图画上个文章已经演示过了这里就不再演示了
四.编写代码
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int left = 0,right = 0, zero = 0,len = 0;
for(;right < nums.size();right++)
{
if(nums[right] == 0)
{
zero++;
}
while(zero > k)
{
if(nums[left] == 0)
{
zero--;
}
left++;
}
len = max(len,right - left + 1);
}
return len;
}
};

1924

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



