《算法闯关指南:优选算法--滑动窗口》--13水果成篮

《算法闯关指南:优选算法--滑动窗口》--13水果成篮

🔥草莓熊Lotso:个人主页

❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》

生活是默默的坚持,毅力是永久的享受。


🎬博主简介:


目录

前言:

水果成篮

解法(滑动窗口):

算法思路:

算法流程:

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

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

算法总结&&笔记展示:


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

水果成篮

题目链接:

904. 水果成篮 - 力扣(LeetCode)

题目描述:

题目示例:

解法(滑动窗口):

算法思路:

研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。

让滑动窗口满足:窗口内水果的种类只有两种。

做法:右端水果进入窗口的时候,用哈希表统计这个水果的频次。这个水果进来后,判断哈希表的大小

  • 如果大小超过 2 :说明窗口内水果种类超过了两种。那么就从最左侧开始依次将水果划出窗口,直到哈希表的大小小于 2 ,然后更新结果;
  • 如果没有超过 2 ,说明当前窗口内水果的种类不超过两种,直到更新结果 ret。

算法流程:

1.初始化哈希表 hash 来统计窗口内水果的种类和数量;

2.初始化变量:左右指针 left=0,right=0,记录结果的变量 ret=0;

3.当 right 小于数组大小的时候,一直执行下列循环:

  • 将当前水果放入哈希表
  • 判断当前水果进来后,哈希表的大小:

                如果超过 2 :

                        将左侧元素滑出窗口,并且在哈希表中将该元素的频次减一;

                        如果这个元素的频次减一之后变成了 0,就把该元素从哈希表中删除;

                        重复上述两个过程,直到哈希表中的大小不超过 2;

  • 更新结果 ret;
  • right++,让下一个元素进入窗口;

4.循环结束后, ret 存的就是最终结果。

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

class Solution { public: int totalFruit(vector<int>& fruits) { //数据范围有限可以使用数组模拟哈希表 int hash[100001]={0};//后面需要加个kinds变量 int n=fruits.size(); int left=0,right=0,len=0; while(right<n) { 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); right++; } return len; } };

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

class Solution { public: int totalFruit(vector<int>& fruits) { //数据范围有限可以使用数组模拟哈希表 int hash[100001]={0};//后面需要加个kinds变量 int n=fruits.size(); int left=0,right=0,kinds=0,len=0; while(right<n) { 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); right++; } return len; } };

算法总结&&笔记展示:

笔记字有点丑,大家见谅:


往期回顾:

《算法闯关指南:优选算法--滑动窗口》--09长度最小的子数串,10无重复字符的最长字串

《算法闯关指南:优选算法--滑动窗口》--11最大连续1的个数 III,12将 x 减到 0 的最小操作数

结语:本篇博客通过滑动窗口处理连续区间问题。当窗口内水果种类超过2种时,左指针右移调整窗口,利用哈希表统计频次,最终求出最大区间长度。提供C++两种实现:容器版和数组模拟哈希表版,并附算法思路图解。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど


Read more

【数据结构和算法】链表的综合算法练习:1.返回倒数第k个节点 2.相交链表 3.回文链表

【数据结构和算法】链表的综合算法练习:1.返回倒数第k个节点 2.相交链表 3.回文链表

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、返回倒数第k个节点 * 1.1题目 * 1.2 算法原理 * 1.3 代码 * 二、相交链表 * 2.1 题目 * 2.2 算法原理 * 2.3 代码 * 三、回文链表 * 3.1 题目 * 3.2 算法原理 * 3.3 代码 * 总结与每日励志 前言 链表作为数据结构的基础核心,是算法面试与嵌入式开发中高频考察的重点。

By Ne0inhk
【算法】【优选算法】链表

【算法】【优选算法】链表

目录 * 一、链表常用技巧与操作总结 * 二、2.两数相加 * 三、24.两两交换链表中的节点 * 3.1 迭代 * 3.2 递归 * 四、143.重排链表 * 五、23.合并K个升序链表 * 5.1 堆 * 5.2 分治 * 5.3 暴力枚举 * 六、25.K个⼀组翻转链表 一、链表常用技巧与操作总结 技巧: * 画图解题。 * 使用虚拟头结点。 * 像有插入类似操作时,直接定义变量,不用考虑节点丢失情况。 * 快慢指针。 操作: * 创建新节点。 * 尾插。 * 头插。 二、2.两数相加

By Ne0inhk
解锁动态规划的奥秘:从零到精通的创新思维解析(9)

解锁动态规划的奥秘:从零到精通的创新思维解析(9)

前言:         小编在前几日写了关于动态规划中的多状态dp的问题,此时小编将会讲述一个动态规划我们常常会遇到的一类问题——股票问题,股票问题就类似小编上一篇所讲述的粉刷房子的问题,可以通过一个二维的dp表来代替多个一维的dp表。买卖股票算是一个很经典的问题了,下面小编简单介绍一下买卖股票问题。         “买卖股票问题”作为动态规划的经典案例,不仅在编程竞赛中频繁出现,也是面试中的常考题目。这类问题以其现实背景的贴近性和解法的多样性著称,不仅考察了对动态规划核心思想的掌握,还能帮助我们深入理解状态转移、子问题划分以及优化策略。         从最基本的一次买卖股票问题,到允许多次买卖甚至设置冷却期和手续费的复杂变体,每一步都体现了动态规划在不同约束条件下的灵活性与精妙性。本篇内容将以逐步深入的方式,剖析买卖股票问题的不同场景,通过数学建模和代码实现,让读者能够全面掌握这一重要的动态规划应用,并在实际问题中灵活运用。 目录 1.买卖股票的最佳时机含冷却期 1.1.题目来源 1.2.题目分析 1.3.思路讲解 1.状态表示 1.2.状态转换方程 3.初

By Ne0inhk
【数据结构与算法】(LeetCode)141.环形链表 142.环形链表Ⅱ

【数据结构与算法】(LeetCode)141.环形链表 142.环形链表Ⅱ

文章目录 * 引言 * 环形链表判断 * 问题描述 * 解决方案:快慢指针法 * 原理分析 * 为什么快慢指针一定能相遇? * 步长选择的数学分析 * 环形链表Ⅱ * 方法一 * 方法二:转换为相交链表问题 * 算法思路 * 实际应用与扩展 * 应用场景 引言 环形链表问题是数据结构与算法中的经典问题,在面试中出现频率极高。这类问题不仅考察对链表结构的理解,更考验解决问题的思维能力和数学分析能力。本文将详细分析环形链表的判断方法以及环入口节点的定位算法,帮助读者深入理解这一重要问题。 环形链表判断 问题描述 给定一个链表的头节点 head,判断链表中是否存在环。 解决方案:快慢指针法 快慢指针法是解决环形链表问题的经典方法,其核心思想是使用两个指针以不同速度遍历链表。 bool hasCycle(structListNode*head){structListNode* slow=head,*fast=head;while(fast&&fast->next){ slow=slow-&

By Ne0inhk