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;
    }
}
相关推荐
努力发光的程序员1 小时前
面试官与程序员谢飞机的3轮Java大厂面试问答实录:涵盖Spring Boot、微服务与数据库技术
java·jvm·spring boot·redis·面试·hibernate·microservices
橙淮1 小时前
并发编程(四)
java·jvm
QiLinkOS1 小时前
发明人与专利价值共生逻辑
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
z落落1 小时前
C# Stack栈 / Queue队列+所有集合 终极一页汇总(全覆盖、零遗漏)
java·开发语言·c#
计算机安禾1 小时前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
磊 子1 小时前
STL之set以及set和map区别
开发语言·c++·算法
Halo_tjn1 小时前
NIO 技术的使用
java·开发语言·nio
砍材农夫1 小时前
物联网 基于netty核心实战-安全tls
java·开发语言·前端·物联网·安全
Python+991 小时前
C++ 内存模型 & 底层原理
java·jvm·c++