题解:
我们可以将该问题进行如下的转化,即:
对于任意的右端点 right
,希望找到最小的左端点 left
,使得 [left,right]
包含不超过 k
个 0
。
所以只要我们枚举所有可能的右端点,将得到的区间的长度取最大值,即可得到答案。
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int res = 0;
int n = nums.size();
int left = 0,zero_num = 0;
for(int right = 0;right < n;right++){
//如果right指向为0,统计0
if(nums[right] == 0) zero_num++;
//统计完之后,要判断0数量是否大于k,如果大于
while(zero_num > k){
//调整左指针,如果左指针为0,减少0的数量
if(nums[left++] == 0) zero_num --;
}
//统计当前窗口最大长度
res = max(res,right - left + 1);
}
return res;
}
};