Leetcode 最大连续 1 的个数 III(medium)

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

2. 题目描述:

3. 解法(滑动窗口):

算法思路:

不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k

个 0 嘛。

因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内 0 的个数不超

过 k 个。

既然是连续区间,可以考虑使用「滑动窗口」来解决问题

算法流程:

a. 初始化一个大小为 2 的数组就可以当做哈希表 hash 了;初始化一些变量 left = 0 ,

right = 0 , ret = 0 ;

b. 当 right 小于数组大小的时候,一直下列循环:

i. 让当前元素进入窗口,顺便统计到哈希表中;

ii. 检查 0 的个数是否超标:

• 如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到 0 的个数恢复正

常;

iii. 程序到这里,说明窗口内元素是符合要求的,更新结果;

iv. right++ ,处理下一个元素;

c. 循环结束后, ret 存的就是最终结果。

C++ 算法代码:

cpp 复制代码
class Solution
{
public:
    int longestOnes(vector<int>& nums, int k)
    {
        int ret = 0;
        for(int left = 0, right = 0, zero = 0; right < nums.size(); right++)
        {
            if(nums[right] == 0) zero++; // 进窗口
            while(zero > k) // 判断
            if(nums[left++] == 0) zero--; // 出窗口
            ret = max(ret, right - left + 1); // 更新结果
        }
        return ret;
    }
};

C++ 代码结果:

Java 算法代码:

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;
    }
}

Java 运行结果:

相关推荐
To_OC4 分钟前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC14 分钟前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师22 分钟前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水25 分钟前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25011 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
阳明山水2 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾2 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
AI科技星2 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
恣逍信点2 小时前
《凌微经》通俗解读——哲学第一因
学习·职场和发展·创业创新·学习方法·业界资讯·交友·哲学
大鱼>3 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物