一、题目描述
二、解题思路
采用双指针的方法来解决这个问题。
定义变量countzero来记录窗口内0的数量,当countzero大于k时,窗口收缩,left移动到窗口内第一个0的后面一个位置,将这个弹出来的“翻转机会”让给right指向的数,直到right出界,即循环结束。
三、代码实现
时间复杂度:T(n)=O(n)
空间复杂度:S(n)=O(1)
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
//滑动窗口
int left=0,right=0,n=nums.size();
int ret=0,countzero=0;
while(right<n){
//进窗口
if(nums[right]==0) countzero++;
//出窗口
while(countzero > k){
if(nums[left]==0) countzero--;
left++;
}
//更新
ret=max(ret,right-left+1);
right++;
}
return ret;
}
};