1004.(最多改变 K 次)的【最多】连续 1 的个数 III
class Solution:
# 滑窗法 + 前缀和
# 对于任意的右端点 right,希望找到最小的左端点 left,使得 [left,right] 包含不超过 k 个 0
# 只要我们枚举所有可能的右端点,将得到的区间的长度取最大值,即可得到答案
def longestOnes(self, nums: List[int], k: int) -> int:
n = len(nums)
# lsum、rsum分别表示左、右端点的前缀和(即含有1的数量,但需要将0、1反转!)
left = lsum = rsum = 0
ans = 0
for right in range(n):
rsum += 1 - nums[right] # 将0、1反转求和
# 左、右端点的前缀和之差大于k则不满足,需要前移左指针
while k < rsum - lsum:
lsum += 1 - nums[left]
left += 1 # 不满足,则左指针前移一位
ans = max(ans, right - left + 1) # 更新最大值
return ans