题目

分析
由于这个题目相当于是往0里去填1,所以我们在拓展窗口的时候应该尤其关注0的个数。
由于这个题目存在以下关系:
当nums[left,right]的0的个数>k,那么nums[left,right+1]、nums[left,right+2]、....nums[left,end]的0的个数都会>k。
当nums[left,right]的0的个数<=k,其内部的子串的0个数都<=k
那么就满足之前提到的滑动窗口的做题条件:

代码
cpp
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int left = 0, zeroCount = 0, maxLen = 0;
for (int right = 0; right < nums.size(); right++) {
// 扩展右边界
if (nums[right] == 0) {
zeroCount++;
}
// 收缩左边界,直到窗口内 0 的数量 <= k
while (zeroCount > k) {
if (nums[left] == 0) {
zeroCount--;
}
left++;
}
// 更新最大长度(此时窗口 [left, right] 是合法的)
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};
结果
