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 作为目标元素
相关推荐
板板正36 分钟前
SpringAI——向量存储(vector store)
java·spring boot·ai
野生技术架构师42 分钟前
Spring Boot 定时任务与 xxl-job 灵活切换方案
java·spring boot·后端
欧阳小猜2 小时前
深度学习②【优化算法(重点!)、数据获取与模型训练全解析】
人工智能·深度学习·算法
苹果醋32 小时前
Java并发编程-Java内存模型(JMM)
java·运维·spring boot·mysql·nginx
你怎么知道我是队长2 小时前
C语言---编译的最小单位---令牌(Token)
java·c语言·前端
小欣加油2 小时前
leetcode 904 水果成篮
c++·算法·leetcode
有Li2 小时前
CXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛|文献速递-深度学习人工智能医疗图像
论文阅读·人工智能·算法·医学生
君万2 小时前
【LeetCode每日一题】56. 合并区间
算法·leetcode·golang
墩墩同学2 小时前
【LeetCode题解】LeetCode 287. 寻找重复数
算法·leetcode·二分查找
Elieal2 小时前
Java 链表完全指南:从基础到力扣简单题实战
java·leetcode·链表