跳至主要內容

1004. 最大连续1的个数 III

ITCharge大约 2 分钟

1004. 最大连续1的个数 IIIopen in new window

  • 标签:数组、二分查找、前缀和、滑动窗口
  • 难度:中等

题目链接

题目大意

描述:给定一个由 0011 组成的数组 numsnums,再给定一个整数 kk。最多可以将 kk 个值从 00 变到 11

要求:返回仅包含 11 的最长连续子数组的长度。

说明

  • 1nums.length1051 \le nums.length \le 10^5
  • nums[i]nums[i] 不是 00 就是 11
  • 0knums.length0 \le k \le nums.length

示例

  • 示例 1:
输入:nums = [1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0], K = 2
输出:6
解释:[1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1]
将 nums[5]、nums[10]0 翻转到 1,最长的子数组长度为 6
  • 示例 2:
输入:nums = [0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1], K = 3
输出:10
解释:[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1]
将 nums[4]、nums[5]、nums[9]0 翻转到 1,最长的子数组长度为 10

解题思路

思路 1:滑动窗口(不定长度)

  1. 使用两个指针 leftleftrightright 指向数组开始位置。使用 maxcountmax\underline{}count 来维护仅包含 11 的最长连续子数组的长度。
  2. 不断右移 rightright 指针,扩大滑动窗口范围,并统计窗口内 00 元素的个数。
  3. 直到 00 元素的个数超过 kk 时将 leftleft 右移,缩小滑动窗口范围,并减小 00 元素的个数,同时维护 maxcountmax\underline{}count
  4. 最后输出最长连续子数组的长度 maxcountmax\underline{}count

思路 1:代码

class Solution:
    def longestOnes(self, nums: List[int], k: int) -> int:
        max_count = 0
        zero_count = 0
        left, right = 0, 0
        while right < len(nums):
            if nums[right] == 0:
                zero_count += 1
            right += 1
            if zero_count > k:
                if nums[left] == 0:
                    zero_count -= 1
                left += 1
            max_count = max(max_count, right - left)
        return max_count

思路 1:复杂度分析

  • 时间复杂度O(n)O(n)
  • 空间复杂度O(1)O(1)