Day60 | 灵神 | 滑动窗口:最大连续1的个数III
1004.最大连续1的个数III
1004. 最大连续1的个数 III - 力扣(LeetCode)
思路:
和前两天核心思路一样,还是固定右端点,遍历右端点,然后去找左指针往右收缩的条件。
而这个条件一般和题目条件相关。
在本题中就是要找最多翻转k个0后,数组中连续1的个数,换句话说,我们左右区间[l,r]内最多只能包含k个0,超过了就无法翻转,无法翻转就无法保证全是连续的1,。我们只需要记录碰到0的次数,只要碰到0,那么记录0的变量num_zero就++,只要碰到0的次数超过了k,那说明我们现在翻转不了这么多的0,所以我们这时候就可以移动左指针,直到我们的左右区间[l,r]内0的数量小于等于k停止。
完整代码:
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int l=0;
int res=0;
int nums_zero=0;
for(int i=0;i<nums.size();i++)
{
//记录0的数量
if(nums[i]==0)
{
nums_zero++;
}
//左指针收缩条件
while(nums_zero>k)
{
if(nums[l]==0)
nums_zero--;
l++;
}
//记录答案
res=max(res,i-l+1);
}
return res;
}
};