1、题目解析
题目如图。
2、算法解析
通过分析题目,可以将上述题目转化成:找到一个最长子区间,该区间中0的个数小于等于K的值。
解法一:
暴力枚举:依次枚举出所有符合结果的子数组,选择最长的子数组。
解法二:
滑动窗口:
1、初始化:初始化一个计数器,用于统计0的个数,与K作比较,并且初始化两个指针,指针区间则为合法窗口。
2、进入窗口:
3、判断:
出窗口:
更新结果:res取最大值。
3、代码编写
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int res = 0;
for(int left = 0, right = 0, zero = 0; right < nums.size(); right++)
{
if(nums[right] == 0) zero++;//进窗口
while(zero > k) //判断
{
if(nums[left++] == 0) zero--;//出窗口
}
res = max(res, right - left + 1);//更新结果
}
return res;
}
};