11.LeetCode 1004. 最大连续1的个数 III | 滑动窗口解法详解(Java)

目录

[1. 题目解析](#1. 题目解析)

[2. 算法原理 + 编写代码](#2. 算法原理 + 编写代码)

[解法一:暴力枚举 + zero计数器](#解法一:暴力枚举 + zero计数器)

解法二:滑动窗口


1. 题目解析

题目:1004. 最大连续1的个数 III

OJ链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

给定一个二进制数组 nums和一个整数 k,如果可以翻转最多 k0,则返回数组中连续 1的最大个数。

示例 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]

将中间的两个 0翻转到 1,最长的子数组长度为 6

2. 算法原理 + 编写代码

转化思路 :找出最长的子数组,其中 0的个数不超过 k个。

解法一:暴力枚举 + zero计数器

通过双重循环枚举所有子数组,统计每个子数组中 0的个数,超过 k则停止扩展,记录最大长度。

java 复制代码
class Solution {
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int maxLen = 0;

        // 遍历所有可能的子数组起点i
        for (int i = 0; i < n; i++) {
            int zeroCount = 0; // 统计当前子数组中0的个数
            // 遍历所有可能的子数组终点j(j >= i)
            for (int j = i; j < n; j++) {
                if (nums[j] == 0) {
                    zeroCount++;
                }
                // 如果0的个数超过k,就不需要继续扩展j了(因为子数组是连续的,再往后j,0的个数只会更多
                if (zeroCount > k) {
                    break;
                }
                // 更新最大长度
                maxLen = Math.max(maxLen, j - i + 1);
            }
        }

        return maxLen;
    }
}

解法二:滑动窗口

通过维护一个滑动窗口,保证窗口内 0的个数不超过 k,逐步扩大窗口并更新最大长度。

步骤

  1. 初始化 left = 0, right = 0, zero = 0

  2. 右指针 right遍历数组,进窗口 :若 nums[right]0zero计数 +1。

  3. 判断 :若 zero > k,则需要移动左指针 left缩小窗口,出窗口 :若 nums[left]0zero计数 -1,左指针右移。

  4. 更新结果 :每次窗口合法时,更新最大长度 ret = Math.max(ret, right - left + 1)

java 复制代码
class Solution {
    public int longestOnes(int[] nums, int k) {
        int ret = 0;
        for (int left = 0, right = 0, zero = 0; right < nums.length; right++) {
            if (nums[right] == 0) zero++; // 进窗口
            while (zero > k) { // 判断
                if (nums[left++] == 0) zero--; // 出窗口
            }
            ret = Math.max(ret, right - left + 1); // 更新结果
        }
        return ret;
    }
}
相关推荐
Tangyuewei10 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩11 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
wordbaby11 小时前
混合检索:两全其美的艺术
人工智能·算法
小溪学编程11 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
彧azz11 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
HZero.chen11 小时前
Java 匿名类简介
java·匿名类
热心网友俣先生11 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模
用户31268748772011 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
2601_9603563811 小时前
2026秋招运营分析师能力模型:SQL、指标体系、AIGC与业务分析
算法
暖焰核心11 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript