LeetCode 1004. 最大连续1的个数 III

题目描述

1004. 最大连续 1 的个数 III

image-20230307210905964

思路分析

解法一:滑动窗口(推荐)

核心思路

  • 维护一个滑动窗口 [left, right],使窗口内 0 的个数不超过 k。
  • 右指针每次向右扩展一格,若遇到 0 则计数加一。
  • 当窗口内 0 的个数超过 k 时,持续收缩左边界,直到满足条件。
  • 每次更新合法窗口的最大长度。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示数组长度,每个元素最多进出窗口一次。
  • 空间复杂度:O(1),只使用了常数个变量。
class Solution {
    public int longestOnes(int[] nums, int k) {
        int left = 0;
        int zeroCount = 0;
        int res = 0;

        for (int right = 0; right < nums.length; right++) {
            // 右边界扩展,若为 0 则计数加一
            if (nums[right] == 0) {
                zeroCount++;
            }
            // 窗口内 0 的个数超过 k,收缩左边界
            while (zeroCount > k) {
                if (nums[left] == 0) {
                    zeroCount--;
                }
                left++;
            }
            // 更新最大窗口长度
            res = Math.max(res, right - left + 1);
        }

        return res;
    }
}
func longestOnes(nums []int, k int) int {
	left := 0
	zeroCount := 0
	res := 0

	for right := 0; right < len(nums); right++ {
		// 右边界扩展,若为 0 则计数加一
		if nums[right] == 0 {
			zeroCount++
		}
		// 窗口内 0 的个数超过 k,收缩左边界
		for zeroCount > k {
			if nums[left] == 0 {
				zeroCount--
			}
			left++
		}
		// 更新最大窗口长度
		res = max(res, right-left+1)
	}

	return res
}

相似题目

题目 难度 考察点
485. 最大连续 1 的个数 简单 滑动窗口、连续计数
487. 最大连续 1 的个数 II 中等 滑动窗口、最多翻转 1 个 0
424. 替换后的最长重复字符 中等 滑动窗口、字符替换次数限制
1208. 尽可能使字符串相等 中等 滑动窗口、代价限制
1493. 删掉一个元素以后全为 1 的最长子数组 中等 滑动窗口、恰好删除 1 个 0
2024. 考试的最大困扰度 中等 滑动窗口、最多替换 k 个字符
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/75262525
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!