目录
题目:
示例:
分析:
代码+运行结果:
题目:
示例:
分析:
给一个只有0和1的数组,可以将K个0变成1,问最大能得到的全是1的子数组的长度是多少。
这算是很经典的滑动窗口题了。
我们定义左右指针,只不过一开始都在数组的开头,然后我们不断右移右指针,如果右指针遇到0,则将K减1,如果K不够减,那么我们就开始计算左右指针包括的范围,然后记录下最大的连续为1的子数组长度。
当K减完,并且右指针还没有走到数组末尾,我们就开始左移左指针,直到左指针指向了0,我们就将K再加回去,表示我们没有将此刻左指针指向的0变为1,因此K的大小我们加一再加回去。
如此循环直到右指针指向了数组末尾,我们也就遍历完成了。
代码+运行结果:
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int l=0;int r=0;
int res=k;
while(r<nums.size()){
if(nums[r]==1) r++;
else if(k>0){
k--;r++;
}else{
res=max(res,r-l);
while(nums[l]==1){
l++;
}
k++;l++;
}
}
res=max(res,r-l);
return res;
//暴力超时 也算是提供一种思路,就不删了放在这里
// int res=k;
// int tk=k;
// int temp=0;
// for(int l=0;l<nums.size()-k;l++){
// temp=0;
// tk=k;
// for(int r=l;r<nums.size();r++){
// if(nums[r]==1) ++temp;
// else if(tk>0){
// --tk;++temp;
// }else{
// break;
// }
// }
// res=max(res,temp);
// }
// return res;
}
};