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

滑动窗口算法详解:13 水果成篮

滑动窗口算法解决水果成篮问题。题目要求连续区间内最多包含两种水果,求最大长度。使用哈希表或数组统计窗口内水果频次。右指针扩展窗口,当种类超过 2 种时左指针收缩,直到满足条件。更新最大长度记录。提供 C++ 容器版与数组模拟哈希表版两种实现方案。

Elasticer发布于 2026/3/15更新于 2026/10/1990 浏览
滑动窗口算法详解:13 水果成篮

文章配图

13 水果成篮

题目链接:

文章配图

题目示例:

文章配图

解法(滑动窗口):
算法思路:

研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。 让滑动窗口满足:窗口内水果的种类只有两种。 做法:右端水果进入窗口的时候,用哈希表统计这个水果的频次。这个水果进来后,判断哈希表的大小:

  • 如果大小超过 2:说明窗口内水果种类超过了两种。那么就从最左侧开始依次将水果划出窗口,直到哈希表的大小小于 2,然后更新结果;
  • 如果没有超过 2,说明当前窗口内水果的种类不超过两种,直到更新结果 len。
算法流程:
  1. 初始化哈希表 hash 来统计窗口内水果的种类和数量;
  2. 初始化变量:左右指针 left = 0,right = 0,记录结果的变量 len = 0;
  3. 当 right 小于数组大小的时候,一直执行下列循环:
    • 将当前水果放入哈希表
    • 判断当前水果进来后,哈希表的大小:
      • 如果超过 2:
        • 将左侧元素滑出窗口,并且在哈希表中将该元素的频次减一;
        • 如果这个元素的频次减一之后变成了 0,就把该元素从哈希表中删除;
        • 重复上述两个过程,直到哈希表中的大小不超过 2;
    • 更新结果 len;
    • right++,让下一个元素进入窗口;
  4. 循环结束后,len 存的就是最终结果。
C++代码演示:方法一 (使用容器)
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        // 方法一:使用容器 (如果对哈希掌握不是很好可以看下面方法二)
        unordered_map<int, int> hash; // 统计窗口内出现水果的种类
        int left = 0;
        int right = 0;
        int len = 0;
        for(right = 0; right < fruits.size(); right++) {
            hash[fruits[right]]++; // 进窗口
            while(hash.size() > 2) { // 判断
                hash[fruits[left]]--; // 出窗口
                if(hash[fruits[left]] == 0) {
                    hash.erase(fruits[left]);
                }
                left++;
            }
            len = max(len, right - left + 1); // 更新结果
        }
        return len;
    }
};
C++代码演示:方法二 (用数组模拟哈希表)
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        // 方法二:用数组模拟哈希表 (只需要了解哈希可以对数据存放的次数进行计数即可)
        int hash[100001] = { 0 }; // 根据题目提示可知水果种类最多不超过 100000
        int left = 0;
        int right = 0;
        int len = 0;
        int kinds = 0; // 用一个新变量来维护水果种类
        for(right = 0; right < fruits.size(); right++) {
            if(hash[fruits[right]] == 0) {
                kinds++;
            }
            hash[fruits[right]]++; // 进窗口
            while(kinds > 2) { // 判断
                hash[fruits[left]]--; // 出窗口
                if(hash[fruits[left]] == 0) {
                    kinds--;
                }
                left++;
            }
            len = max(len, right - left + 1); // 更新结果
        }
        return len;
    }
};
算法总结及流程解析:

文章配图

文章配图

目录

  1. 13 水果成篮
  2. 题目链接:
  3. 题目示例:
  4. 解法(滑动窗口):
  5. 算法思路:
  6. 算法流程:
  7. C++代码演示:方法一 (使用容器)
  8. C++代码演示:方法二 (用数组模拟哈希表)
  9. 算法总结及流程解析:

更多推荐文章

查看全部
  • Quest 一体机 SideQuest 安装与本地游戏导入指南
  • GESP 2024 年 3 月 C++ 二级认证判断题解析(1-10)
  • WebRTC 调试实战:基于 Chromium 的高效问题定位方法
  • 腾讯云轻量应用服务器部署 OpenClaw 并接入 QQ 飞书机器人
  • FAIR plus 机器人全产业链接会:聚焦具身智能与产业链协同
  • Stable Diffusion v1.5 创意设计师指南:嵌入 Figma/PS 工作流
  • AI 产品经理转行大模型领域:必备素质与技能指南
  • 基于单片机的智能家居监控系统设计与实现
  • AI入门系列:AI新手必看:人工智能发展历程与现状分析
  • AI 小说生成器本地部署指南
  • Wi-Fi 安全原理与防御:基于 Python Scapy 的 WPA2 握手包分析
  • 滑动窗口算法:经典例题与实现思路
  • 无人机视觉目标检测数据集 VisDrone 详解与格式转换
  • 国内热门 AI 绘画工具盘点(上)
  • AI 视频生成模型构建、实现与调试指南
  • Ubuntu Linux 操作系统安装与配置指南
  • OpenClaw 零成本部署指南:基于 GitHub Codespaces 与 Discord
  • Clawdbot 结合 Qwen3-32B 在 HR 与 IT 运维场景的落地实践
  • MySQL EXPLAIN 实战:6 种索引失效场景验证与优化
  • AI Agent Skills 资源合集:支持 Cursor、Claude Code 与 Copilot 的一键部署方案

相关免费在线工具

  • 加密/解密文本

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