《算法题讲解指南:优选算法-滑动窗口》--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

Python pytest 框架通关指南:自动化测试不再难

Python pytest 框架通关指南:自动化测试不再难

文章目录 * 一、pytest介绍 * 1.1 pytest的优点 * 1.2 主流Python接口自动化框架对比 * 二、安装 * 三、用例运行规则 * 四、pytest命令参数 * 4.1 常见参数 * 4.2 命令使用示例 * 五、pytest配置文件 * 5.1 常见配置选项 * 5.2 配置示例 * 六、前后置操作 * 6.1 setup_method 和 teardown_method * 6.2.setup_class 和 teardown_class * 七、断言 * 7.1 基本数据类型断言:

By Ne0inhk

一篇最全Python 爬虫超详细讲解(零基础入门,适合小白)

一篇最全Python 爬虫超详细讲解(零基础入门,适合小白) 大家好!我是 Grok,由 xAI 构建。今天我们来聊聊 Python 爬虫。作为一个零基础教程,我会从最简单的地方开始,一步步带你入门。爬虫(Web Scraping)就是用程序自动从网站上抓取数据的工具,比如下载图片、收集新闻、分析价格等。为什么学?因为它超级实用,能帮你自动化很多重复工作,比如监控电商价格或收集研究数据。 注意:爬虫要遵守法律和道德!不要爬取受保护的数据(如个人信息),尊重 robots.txt 协议,避免高频请求导致网站崩溃。否则可能被封 IP 或面临法律风险。 这个教程基于 2026 年最新实践(Python 3.12+),结合了网络上热门资源(如 Bilibili 尚硅谷教程、知乎文章等)

By Ne0inhk

Python 2026 年发展局势:AI 时代的 “通用基础设施语言”

2026 年的 Python 已从 “热门编程语言” 进化为全球数字生态的核心基础设施语言,其地位不仅稳固且进一步强化,同时也面临新的机遇与挑战,整体呈现 “一核多翼、优势固化、局部竞争” 的格局。 一、核心优势:AI + 全生态双轮驱动,地位无可替代 1. AI / 大模型领域的绝对霸主这是 Python 最核心的护城河。2026 年大模型落地、AI Agent 开发、多模态应用、低代码 AI 工具等场景中,Python 依然是95% 以上开发者的首选语言: * 生态垄断:PyTorch 3.0、TensorFlow 2.18、LangChain 2.0、Transformers 等核心框架均以 Python 为第一开发语言; * 效率优势:

By Ne0inhk
在Windows11系统上配置interl Realsense D435i深度相机+Python

在Windows11系统上配置interl Realsense D435i深度相机+Python

一、产品介绍 Intel RealSense D435i是英特尔公司推出的一款消费级深度相机,它的主要构成如下图所示。 主要包含一个RGB相机、两个红外相机以及一个红外发射器,此外还有一个IMU单元(这也就是D435i和D435的区别,i就表示imu)。简单来说它的深度成像原理是主动立体红外成像,不是传统意义上理解的双目RGB相机成像,这点需要注意一下。 有了深度图(3D点云)和对应的RGB影像,因此也就很容易获得RGB-D点云了。因此从输出的角度而言,D435i可以看做是一个RGB-D传感器相机。后续可以搭配ORB-SLAM中RGB-D的模式进行使用。当然,也可以只用单目RGB影像,以单目SLAM模式运行,或者单目结合IMU,以Mono-Initial模式运行。唯一不能运行的是双目RGB模式(因为两个红外相机是单通道的)。当然我们可以获取双目的红外影像,以此作为输入,进行双目SLAM,结果也是类似的。因此可以看出,D435i是一个比较“全能”的传感器,从单目、单目+IMU、双目、双目+IMU、RGB-D都可以使用。 对于它的一些技术上的参数,这里也简单列举一下: * 深度技

By Ne0inhk