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

🔥小叶-duck个人主页

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

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

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


目录

[13 水果成篮](#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++代码演示:方法一(使用容器)

cpp 复制代码
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++代码演示:方法二(用数组模拟哈希表)

cpp 复制代码
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++两种实现:容器版和数组模拟哈希表版。**希望大家能有所收获!

相关推荐
Gigavision1 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp2 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz3 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外4 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
汉克老师5 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood5 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz6 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕6 小时前
进一步了解模板
c++
叠层归一研究院7 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia8 小时前
Diffusion Model 的基本原理与模型架构
算法