📅  最后修改于: 2023-12-03 15:09:38.190000             🧑  作者: Mango
给定一个二进制数组和一个整数 K,你需要将最长的连续的 0 的子数组中间的数字从右边替换 K 次,使得替换后得到的 1 的数量最多,并返回该最大值。
输入: nums = [1,0,0,1,1,0,1], k = 2
输出: 6
解释: 用 2 次反转操作将最长的连续 0 数组 [0,0] 反转为 [1,1],可以得到最多的 1,其长度为 6。
这道题可以使用滑动窗口来做,需要左右指针记录当前连续 0 子数组的起始和结尾位置。当窗口中的 0 数量超过了 K 个时,需要移动左指针并更新当前 0 的数量。每次更新当前连续 0 子数组的长度,如果替换 K 个 0 后,子数组长度还能增加,说明可以将最右边的 0 反转,反之则停止反转操作。
代码实现如下:
def longestOnes(nums: List[int], k: int) -> int:
zeros = 0 # 记录当前窗口中 0 的数量
left = right = res = 0 # 初始化左右指针和结果
while right < len(nums):
if nums[right] == 0:
zeros += 1 # 若当前数为 0,将 zeros 计数器 +1
right += 1 # 无论当前数是 0 还是 1,右指针都要移动
while zeros > k: # 当子数组中的 0 数量超过了 K,需要移动左指针
if nums[left] == 0:
zeros -= 1 # 若最左边的数是 0,将 zeros 计数器 -1
left += 1 # 左指针右移
res = max(res, right - left) # 更新子数组长度
if right - left == k+1 and nums[left] == 0:
left += 1 # 若替换 K 个 0 后,子数组长度还能增加,说明可以将最右边的 0 反转
return res
时间复杂度:$O(n)$
需要使用滑动窗口遍历一遍数组,时间复杂度为 $O(n)$。
空间复杂度:$O(1)$
只需要常数级别的额外空间用于记录 0 的数量和左右指针。