题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
硬往题目介绍上边去想的话其实非常困难,如果换种方式思考就会简单许多。
若我们将思想转化为,找出最长的子串(里面含有的0的数量最大为k),然后返回其最长长度。
这样思路就清晰了许多,那么我们使用一个zero变量来记录0的个数,利用滑动窗口思想来解决,若当前进窗口的值是0那么zero++,若出窗口的该值是0那么zero--,保证zero<=k即可。
代码
class Solution
{
public:
int longestOnes(vector<int>& nums, int k)
{
int n=nums.size();
int ret=0;
for(int left=0,zero=0,right=0;right<n;right++)
{
// 进窗口
// 如果该数是0 那么我们zero变量就++
if(nums[right]==0) zero++;
// 出窗口
// 若此时zero的大小已经大于k
while(zero>k)
{
// 出窗口
if(nums[left]==0)
zero--;
// 更新窗口
left++;
}
// 更新结果
ret=max(ret,right-left+1);
}
return ret;
}
};