LeetCode1004. 最大连续1的个数 III

题目分析

本题要求在最多翻转 K 个 0 的条件下,找到二进制数组中最长的连续 1 子数组。翻转操作实际上是将 0 视为可用资源,用来扩展连续 1 的区间。

解题思路

  1. 滑动窗口(双指针)
    • 核心思想:维护一个窗口,确保窗口内最多包含 K 个 0(即最多可翻转 K 次)
    • 右指针:遍历数组,扩展窗口
    • 左指针:当窗口内 0 的数量超过 K 时,收缩窗口直到满足条件
  1. 关键操作
    • 遇到 0 时增加计数器
    • 当 0 的数量超过 K 时,移动左指针直到移除一个 0
    • 始终记录窗口的最大长度

完整代码

java 复制代码
public class LeetCode1004 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine().trim();
        String[] strs = line.split(",");
        int[] arr = new int[strs.length];
        for (int i = 0; i < strs.length; i++) {
            arr[i] = Integer.parseInt(strs[i]);
        }
        int k = Integer.parseInt(br.readLine().trim());
        System.out.println(new Solution().longestOnes(arr, k));
    }
    static class Solution {
        public int longestOnes(int[] nums, int k) {
            int left = 0;      // 窗口左指针
            int zeroCount = 0; // 当前窗口中0的数量
            int maxLength = 0; // 记录最大窗口长度(即最大连续1的长度)

            // 1. 右指针遍历数组
            for (int right = 0; right < nums.length; right++) {
                // 2. 遇到0时增加计数器
                if (nums[right] == 0) {
                    zeroCount++;
                }

                // 3. 如果0的数量超过K,移动左指针直到移除一个0
                while (zeroCount > k) {
                    if (nums[left] == 0) {
                        zeroCount--;
                    }
                    left++;
                }

                // 4. 更新最大窗口长度
                maxLength = Math.max(maxLength, right - left + 1);
            }

            return maxLength;
        }
    }
}

知识点分类

  • 滑动窗口算法
    • 双指针维护可变大小窗口
    • 时间复杂度 O(n),空间复杂度 O(1)
  • 边界处理
    • 自动兼容 k=0 的特殊情况(相当于找原生连续1)
    • 处理数组全为1的情况(此时 zeroCount 始终为0)
  • 循环控制
    • 使用 while 确保窗口始终满足约束条件
    • 右指针单向前进,左指针有条件前进
  • 问题转化技巧
    • 将"翻转操作"转化为"窗口内0的数量限制"
    • 0 作为可消耗资源,1 作为目标元素
相关推荐
xushichao19892 分钟前
代码生成优化技术
开发语言·c++·算法
炽烈小老头9 分钟前
【每天学习一点算法 2026/03/22】前 K 个高频元素
学习·算法
2401_8732046515 分钟前
模板编译期循环展开
开发语言·c++·算法
木心月转码ing15 分钟前
Hot100-Day51-TT70爬楼梯
算法
NAGNIP16 分钟前
一文搞懂经典的优化算法都有哪些?
算法
CoovallyAIHub18 分钟前
2.5GB 塞进浏览器:Mistral 开源实时语音识别,延迟不到半秒
深度学习·算法·计算机视觉
我真会写代码19 分钟前
深度解析并发编程锁升级:从偏向锁到重量级锁,底层原理+面试考点全拆解
java·并发编程·
Meepo_haha24 分钟前
创建Spring Initializr项目
java·后端·spring
会编程的土豆24 分钟前
C++中的 lower_bound 和 upper_bound:一篇讲清楚
java·数据结构·算法
NAGNIP25 分钟前
一文搞懂深度学习中的损失函数设计!
人工智能·算法