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

目录

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

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

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

解法二:滑动窗口


1. 题目解析

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

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

给定一个二进制数组 nums和一个整数 k,如果可以翻转最多 k个 0,则返回数组中连续 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]为 0,zero计数 +1。

  3. 判断 :若 zero > k,则需要移动左指针 left缩小窗口,出窗口 :若 nums[left]为 0,zero计数 -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;
    }
}
相关推荐
杨凯凡3 分钟前
Spring Boot 链路追踪实战:Micrometer、TraceId 与异步线程上下文传播
java·spring boot·后端
计算机毕设定制辅导-无忧学长20 分钟前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
非优秀程序员9 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
非优秀程序员9 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻10 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊12 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪14 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息14 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java