跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

同向双指针滑动窗口算法:最大连续 1 的个数 III、将 x 减到 0 的最小操作数

滑动窗口算法用于解决最大连续 1 的个数 III 与将 x 减到 0 的最小操作数两道题目。前者通过维护窗口内 0 的数量不超过 k 来寻找最长连续区间;后者将问题转化为求和为总和减去 x 的最长连续子数组。两种解法均使用双指针技巧,时间复杂度 O(n),空间复杂度 O(1)。

2177283801发布于 2026/3/27更新于 2026/9/1161 浏览
同向双指针滑动窗口算法:最大连续 1 的个数 III、将 x 减到 0 的最小操作数

011 最大连续 1 的个数 III

力扣链接:1004. 最大连续 1 的个数 III

1.1 题目详解

1.2 算法原理以及代码实现

1.2.1 解法思路:滑动窗口

不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k 个 0。 因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内的 0 个数不超过 k 个。 既然是连续区间,可以考虑使用「滑动窗口」来解决问题。

1.2.2 算法流程
  1. 初始化一些变量 left = 0,right = 0,ret = 0;
  2. 当 right 小于数组大小的时候,一直下列循环—— (1)让当前元素进入窗口,顺便统计到哈希表中; (2)检查 0 的个数是否超标:

    1)如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到 0 的个数恢复正常; (3)程序到这里,说明窗口内元素是符合要求的,更新结果; (4)right++,处理下一个元素;

  3. 循环结束后,ret 存的就是最终结果。
1.2.3 代码实现
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); 
        } 
         ret; 
    } 
};
return

时间复杂度:O(n),空间复杂度:O(1)。

1.3 博主手记

本题整个的思路、算法原理、解题过程建议在纸上推导一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!


012 将 x 减到 0 的最小操作数

力扣链接:1658. 将 x 减到 0 的最小操作数

2.1 题目详解

2.2 算法原理

2.2.1 解法思路:滑动窗口

题目要求的是数组「左端 + 右端」两段连续的、和为 x 的最短数组,信息量稍微多一些,不易理清思路;我们可以转化成求数组内一段连续的、和为 sum(nums) - x 的最长数组。此时,就是熟悉的「滑动窗口」问题了。

2.2.2 算法流程
  1. 转化问题:求 target = sum(nums) - x。如果 target<0,问题无解;
  2. 初始化左右指针 l = 0,r = 0(滑动窗口区间表示为 [ l,r) ,左右区间是否开闭很重要,必须设定与代码一致),记录当前滑动窗口内数组和的变量 sum=0,记录当前满足条件数组的最大区间长度 maxLen = -1;
  3. 当小于等于数组长度时,一直循环:

    (1)如果 sum<target,右移右指针,直至变量和大于等于 target,或右指针已经移到头; (2)如果 sum>target,右移左指针,直至变量和小于等于 target,或左指针已经移到头; (3)如果经过前两步的左右移动使得 sum == target,维护满足条件数组的最大长度,并让下个元素进入窗口。

  4. 循环结束后,如果 maxLen 的值有意义,则计算结果返回;否则,返回 -1。
2.2.3 代码实现
class Solution { 
public: 
    int minOperations(vector<int>& nums, int x) { 
        int sum = 0; 
        for (int a : nums) sum += a; 
        int target = sum - x; 
        //细节问题 
        if (target < 0) return -1; 
        int ret = -1; 
        for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++)//tmp:和 sum 区分 
        { 
            tmp += nums[right];//进窗口 
            //判断 
            while (tmp > target) tmp -= nums[left++];//出窗口 
            if (tmp == target)//更新结果 
                ret = max(ret, right - left + 1); 
        } 
        if (ret == -1) return ret; 
        else return nums.size() - ret; 
    } 
};

时间复杂度:O(n),空间复杂度:O(1)。

2.3 博主手记

本题整个的思路、算法原理、解题过程建议在纸上推导一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!

目录

  1. 011 最大连续 1 的个数 III
  2. 1.1 题目详解
  3. 1.2 算法原理以及代码实现
  4. 1.2.1 解法思路:滑动窗口
  5. 1.2.2 算法流程
  6. 1.2.3 代码实现
  7. 1.3 博主手记
  8. 012 将 x 减到 0 的最小操作数
  9. 2.1 题目详解
  10. 2.2 算法原理
  11. 2.2.1 解法思路:滑动窗口
  12. 2.2.2 算法流程
  13. 2.2.3 代码实现
  14. 2.3 博主手记

更多推荐文章

查看全部
  • 大模型与生成式 AI 的技术演进及应用思考
  • 4 个提升开发者效率的 AI 开源工具推荐
  • C++ 智能指针完全指南:原理、用法与避坑实战
  • C++ 标准库容器适配器:Stack、Queue 与 Priority Queue 详解
  • C++ 继承中同名成员的隐藏与重载规则解析
  • C++ 连接 Redis:redis-plus-plus 安装与使用入门
  • OpenAI Codex 开发环境配置与实战指南
  • Whisper v0.2 语音转文字工具安装与使用教程
  • Git 安全警告修复:解决 fatal: detected dubious ownership in repository at 错误
  • Stable Diffusion 3.5 FP8 多卡并行实测:双 GPU 扩展性分析
  • Whisper-medium.en 企业级英文语音转写实战指南
  • Android 动态替换 Application 实现
  • Python 自学指南:培养良好编程习惯与避坑建议
  • 图论算法入门:DFS 与 BFS 及树图遍历
  • Python adaptive-stratification 包语法、参数与实战案例
  • 自然语言处理在社交媒体分析中的应用与实战
  • ModelScope 魔搭社区介绍与大模型微调指南
  • Kotaemon:基于 RAG 技术的多语言模型问答系统
  • Wan2.1 模型在 ComfyUI 中的本地部署与远程访问
  • OpenClaw 16 款 AI Agent 选型指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online