《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

13 水果成篮

题目链接:

​编辑

题目示例:

解法(滑动窗口):

算法思路:

算法流程:

C++代码演示:方法一(使用容器)

C++代码演示:方法二(用数组模拟哈希表)

算法总结及流程解析:

结束语


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

算法总结及流程解析:

结束语

       到此,13 水果成篮 这道算法题就讲解完了。通过滑动窗口处理连续区间问题。当窗口内水果种类超过2种时,左指针右移调整窗口,利用哈希表统计频次,最终求出最大区间长度。提供C++两种实现:容器版和数组模拟哈希表版。希望大家能有所收获!

Read more

实战Pi0机器人控制中心:轻松实现机器人智能操控

实战Pi0机器人控制中心:轻松实现机器人智能操控 1. 项目概述:重新定义机器人控制体验 Pi0机器人控制中心是一个基于先进视觉-语言-动作模型的智能操控平台,它彻底改变了传统机器人控制的复杂方式。这个项目将多视角视觉感知、自然语言理解和精准动作控制完美融合,让机器人操控变得像与人对话一样简单直观。 想象一下,你只需要对机器人说"捡起那个红色方块",它就能准确理解并执行相应动作。这就是Pi0控制中心带来的革命性体验——无需编写复杂的控制代码,无需记忆繁琐的操作指令,用最自然的方式与机器人进行交互。 这个控制中心采用全屏Web界面设计,界面简洁现代,操作流程直观。无论你是机器人技术爱好者、研究人员,还是教育工作者,都能快速上手使用,专注于机器人应用开发而不是底层技术实现。 2. 核心功能详解:智能操控的四大支柱 2.1 多视角视觉感知系统 Pi0控制中心支持同时输入三个不同角度的环境图像:主视角、侧视角和俯视角。这种多视角设计模拟了人类观察环境的自然方式,为机器人提供了全面的环境感知能力。 * 主视角摄像头:提供机器人正前方的视野,用于识别主要操作对象 * 侧视角

By Ne0inhk

AI × 低代码 × 工程化:Oinone Pamirs 的下一代产品化引擎实践

AI × 低代码 × 工程化:Oinone Pamirs 的下一代产品化引擎实践 一、传统企业软件交付的「不可能三角」困境 在传统企业软件开发领域,长期存在一个被称为「不可能三角」的困境:交付速度、产品质量与成本控制三者难以兼得。追求快速上线往往牺牲稳定性;强调高质量则拖慢节奏;控制成本又可能导致功能缩水或技术债堆积。尤其在定制化项目泛滥的行业(如政务、金融、制造),软件公司常年陷于「接单—开发—维护—再接单」的恶性循环中,难以形成可复用的产品资产。 1.1 项目制开发的致命缺陷 当前,大量中小型软件公司仍采用「项目制」开发模式:每个客户提出差异化需求,团队便从零开始编码,最终交付一套高度定制化的系统。这种模式看似灵活,实则代价高昂: * 代码无法复用:相似功能(如用户管理、审批流、报表)在不同项目中反复重写 * 维护成本指数级增长:十个客户意味着十套独立系统,

By Ne0inhk

本地AI绘画新选择:Z-Image-Turbo_UI界面真实体验

本地AI绘画新选择:Z-Image-Turbo_UI界面真实体验 最近在测试几款轻量级本地AI绘图工具时,偶然发现了一个特别“省心”的方案——Z-Image-Turbo_UI界面。它不像传统Stable Diffusion整合包那样动辄要配环境、装依赖、调参数,而是直接跑起一个干净的Gradio界面,打开浏览器就能用。更关键的是:不联网、不传图、不依赖云服务,所有生成过程都在你自己的电脑里完成。我用一台RTX 3060笔记本实测了三天,从启动到出图、从修图到批量保存,全程没报错、没卡死、没弹出任何奇怪的警告框。这篇文章就带你完整走一遍真实使用流程,不讲虚的,只说你打开后真正会遇到什么、怎么操作、效果如何、哪些地方值得多点两下。 1. 为什么说它“开箱即用”?——零配置启动体验 很多新手被劝退,不是因为不会写提示词,而是卡在第一步:环境装不上、CUDA版本对不上、模型路径找不到……Z-Image-Turbo_UI绕开了所有这些坑。 它本质是一个预打包的Python脚本+模型权重+Gradio前端的组合体,所有依赖都已内置。你不需要:

By Ne0inhk

vitis安装图文教程:零基础入门FPGA开发环境配置

手把手带你完成 Vitis 安装:从零搭建 FPGA 开发环境 你是不是也曾在搜索“vitis安装”时,被一堆术语、版本号和报错信息搞得晕头转向?明明只是想开始学 FPGA,怎么第一步就卡在了环境配置上? 别急。这篇文章不玩虚的,也不甩文档链接。我会像一个老工程师坐在你旁边一样,一步步带你把 Vitis 装好、跑通、用起来。无论你是电子专业学生、转行嵌入式的新手,还是对硬件加速感兴趣的软件开发者,只要跟着走,2小时内你就能拥有一个完整可用的 FPGA + SoC 开发环境。 为什么是 Vitis?它到底解决了什么问题? 先说清楚一件事: Vitis 不是你传统印象里的 FPGA 工具 。 以前做 FPGA,得写 Verilog/VHDL,画电路图,综合布局布线……门槛高、周期长。而今天很多项目——比如图像识别、

By Ne0inhk