📌  相关文章
📜  翻转 K 长度子数组中的所有 0 后连续 1 的最大数量(1)

📅  最后修改于: 2023-12-03 14:57:04.895000             🧑  作者: Mango

题目简介

给定一个仅包含 0 和 1 的数组,我们最多可以将 k 个 0 翻转为 1,找出其中最长的连续 1 的个数。

解题思路

既然题目中说我们最多可以将 k 个 0 翻转为 1,那我们就直接翻就行了。具体做法是:

  1. 维护两个指针 left 和 right,它们指向当前连续一段的左右两端
  2. 我们用一个变量 numZeros 记录当前区间中还可以翻转的 0 的个数
  3. 如果当前的数字是 0,那么根据 numZeros 是否大于 0 进行如下操作:
    • 如果 numZeros > 0,则可以把这个 0 翻转成 1,numZeros 减 1,然后 right 指针后移
    • 如果 numZeros <= 0,则这个 0 不能翻转,此时我们需要移动 left 指针,同时将 left 指向的数字变成 0,同时 numZeros 加 1。
  4. 如果当前的数字是 1,那么直接将 right 指针后移
  5. 每次 right 指针后移的时候,都要记录当前区间内连续 1 的个数,以及当前的最大值

这个做法的时间复杂度是 O(n),空间复杂度是 O(1)。

代码实现

def longestOnes(nums: List[int], k: int) -> int:
    n = len(nums)
    left = right = 0
    numZeros = k
    ans = 0
    
    while right < n:
        if nums[right] == 0:
            if numZeros > 0:
                numZeros -= 1
                right += 1
            else:
                if nums[left] == 0:
                    numZeros += 1
                left += 1
        else:
            right += 1
        
        ans = max(ans, right - left)
    
    return ans

测试样例

输入:

nums = [1,1,0,1,1,0,0,1,1,1]
k = 2

输出:6

解释:将第 2 和第 6 个 0 翻转成 1,我们可以得到连续的 1。

总结

这道题是一道典型的滑动窗口问题,可以使用双指针来解决。在实现的过程中需要注意左指针和右指针的移动以及 numZeros 变量的维护。