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

滑动窗口算法实战:最大连续 1 与最小操作数

滑动窗口算法用于解决连续子数组问题。示例一寻找最多含 k 个 0 的最长子数组,通过右指针扩张、左指针收缩维护窗口内 0 的数量。示例二将两端移除元素减至 0 的问题转化为寻找和为总和减目标值的最大子数组,最小操作数等于总长减去该子数组长度。提供 C++ 代码实现双指针逻辑及边界条件处理。

不羁发布于 2026/3/22更新于 2026/7/635 浏览
滑动窗口算法实战:最大连续 1 与最小操作数

滑动窗口算法实战

1. 1004. 最大连续 1 的个数 III

题目描述

在这里插入图片描述

思路分析

这道题的核心是:找一个最长的子数组,其中最多包含 k 个 0。

经典的 滑动窗口 问题。

为什么用滑动窗口?

  • 我们需要连续区间 → 滑动窗口天然适合
  • 窗口内维护「0 的个数 ≤ k」这个约束
  • 窗口扩张:右指针右移,遇到 0 就计数
  • 窗口收缩:当 0 的个数超过 k,左指针右移直到满足条件
算法流程
1. 初始化:left = 0, zeroCount = 0, maxLen = 0
2. 遍历数组,right 指针右移:
   - 如果 nums[right] == 0,zeroCount++
   - 当 zeroCount > k 时,收缩左边界:
     - 如果 nums[left] == 0,zeroCount--
     - left++
   - 更新 maxLen = max(maxLen, right - left + 1)
3. 返回 maxLen

在这里插入图片描述

代码实现
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int zero = 0;
        int ret = 0;
        for (int left = 0, right = 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;
    }
};

2. 1658. 将 x 减到 0 的最小操作数

题目描述

在这里插入图片描述

给定一个整数数组 nums 和整数 x。每次操作可以从数组最左端或最右端移除一个元素,使 x 减去该元素的值。返回将 x 恰好减到 0 的最小操作数,无法实现则返回 -1。

示例:

输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:移除最右端的 3,再移除最右端的 2,x = 5 - 3 - 2 = 0
思路分析

逆向思维 + 滑动窗口

从两端取数 → 等价于找一个中间连续子数组,其和为 total - x。

  • 设数组总和为 sum
  • 问题转化为:找最长的子数组,使其和为 sum - x
  • 最小操作数 = n - 最长子数组长度

为什么?

  • 两端取走的元素和 = x
  • 剩下中间的元素和 = sum - x
  • 操作数最少 → 中间剩余最长
算法流程
1. 计算 target = sum(nums) - x
2. 如果 target < 0,返回 -1(总和都不够减)
3. 滑动窗口找和为 target 的最长子数组
4. 返回 n - maxLen(若 maxLen 有效)

在这里插入图片描述

代码实现
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        int cmp = 0;
        int ret = -1;
        for (auto e : nums) {
            sum += e;
        }
        int target = sum - x;
        if (target < 0) return -1;
        for (int left = 0, right = 0; right < nums.size(); right++) {
            cmp += nums[right];
            while (cmp > target) {
                cmp -= nums[left++];
            }
            if (cmp == target) {
                ret = max(ret, right - left + 1);
            }
        }
        if (ret == -1) return ret;
        else return nums.size() - ret;
    }
};

目录

  1. 滑动窗口算法实战
  2. 1. 1004. 最大连续 1 的个数 III
  3. 题目描述
  4. 思路分析
  5. 算法流程
  6. 代码实现
  7. 2. 1658. 将 x 减到 0 的最小操作数
  8. 题目描述
  9. 思路分析
  10. 算法流程
  11. 代码实现
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 时序数据库选型指南:Apache IoTDB 工业物联网应用实践
  • 前端面试复盘:透过问题看技术深度与工程素养
  • getBoundingClientRect 方法完全指南
  • Stable Diffusion 3.5 云端部署与图像生成实测
  • Mac 系统唤醒增强工具 Amphetamine Enhancer 使用指南
  • 零基础转行网络安全就业前景与技能路径分析
  • 零基础学习网络安全指南:职业方向与技能路径
  • 零基础学习网络安全指南:职业方向与技能路径
  • 零基础学习网络安全指南:核心方向与入门路径
  • 跨国企业 Git 连接困境分析与智能代理配置方案
  • 零基础学习 Python 必备开发工具与库指南
  • 零基础学习网络安全技术入门指南
  • Milvus 实战:Attu 可视化安装与 Python 整合指南
  • 语音交互实战:基于 WebRTC 与 AI 接口构建实时语音对话系统
  • Ubuntu 部署 OpenClaw 并接入飞书机器人
  • Windows 环境 AI 绘画工具网络代理冲突及 JSON 报错解决
  • AI 数据标注工具实战:提速 3 倍的经验总结
  • Python纪念币预约自动化系统架构设计与实现
  • Python 列表内存存储本质:差异原因与优化建议
  • VSCode 本地运行 DeepSeek 模型教程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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