Max Consecutive Ones II,LeetCode,487

题目描述:

给定一个二进制数组,你可以最多翻转一个 1,求最长连续 1 的个数。

示例:

输入: [1,0,1,1,0] 输出: 4 解释: 翻转第二个 0 可以得到最长的连续 1 的序列。

解题思路:

这道题可以使用滑动窗口的技巧来解决。滑动窗口的思路是维护一个窗口,这个窗口内最多包含一个 ,然后计算这个窗口的长度。

具体步骤:

  1. 初始化变量:
    • leftright 指针,表示窗口的左右边界。
    • zero_count 记录窗口内 的个数。
    • max_len 记录最长连续 1 的长度。
  2. 滑动窗口:
    • 使用 right 指针遍历数组。
    • 如果当前元素是 zero_count 增加。
    • 如果 zero_count 超过 1,说明窗口内有两个 ,需要移动 left 指针,直到 zero_count 重新变为 1
    • 在每次移动 right 指针后,更新 max_lenright - left + 1
  3. 返回结果:
    • 遍历结束后,max_len 就是所求的最长连续 1 的长度。

代码实现:

def findMaxConsecutiveOnes(nums): left = 0 zero_count = 0 max_len = 0

for right in range(len(nums)):
    if nums[right] == 0:
        zero_count += 1

    while zero_count > 1:
        if nums[left] == 0:
            zero_count -= 1
        left += 1

    max_len = max(max_len, right - left + 1)

return max_len

示例

nums = [1, 0, 1, 1, 0] print(findMaxConsecutiveOnes(nums)) # 输出: 4

解释:

  • leftright 指针用于维护滑动窗口的边界。
  • zero_count 用于记录当前窗口内 的个数。
  • zero_count 超过 1 时,说明窗口内有两个 ,需要移动 left 指针,直到窗口内只有一个
  • 每次移动 right 指针后,更新 max_len 为当前窗口的长度。

复杂度分析:

  • 时间复杂度: O(n),其中 n 是数组的长度。每个元素被访问两次(一次是 right 指针,一次是 left 指针)。
  • 空间复杂度: O(1),使用了常数个额外空间。

这种方法高效且直观,利用滑动窗口的技巧很好地解决了问题。希望这个解释对你有所帮助!如果有其他问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注