[滑动窗口] 13. 水果成篮

一. 题目描述



题目简述: 找出一个最长的连续区域(最长子数组),使这个连续的区域中最多有两种水果类型。

二. 解题思路

1)首先想到暴力解法,两个指针枚举所有子数组,并通过map或unordered_map充当篮子来建立水果类型和数量间的映射,表中元素不能超过2。

**2)优化:**当出现第三种类型时,当前left的所有情况就结束了,固定下一个left时,right只可能不动或前进,一定不需要返回,所以两指针同向前进,是滑动窗口。

3)具体步骤:

  1. 进窗口:将当前fruitsright放到哈希表中,并将映射值,即该种类水果的数量++。

  2. 判断是否需要出窗口:如果哈希表中元素个数(即水果种类数)超过2(只有两个篮子也就只能装两种类型的水果),则需要出窗口:将fruitsleft类型对应的数量--,并判断此次--之后篮子中是否还有该种类的水果,如果没有了(mfruits\[left] == 0),就把该种类从哈希表中移除。

  3. 更新结果:此时篮中水果一定是符合要求的,更新结果。

根据提示信息,水果的类型数不会超过10^5,那么我们就可以用一个数组来模拟哈希表,将对哈希表的增删差改,变成对数组做操作,提升效率。

三. 代码实现

1)使用容器

unordered_map和map都可以,推荐unordered_map效率更高

cpp 复制代码
class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        int left = 0, right = 0, maxnum = 0;
        unordered_map<int, int> m;

        for(; right < fruits.size(); right++)
        {
            m[fruits[right]]++;

            while(m.size() > 2)
            {
                m[fruits[left]]--;
                if(m[fruits[left]] == 0) m.erase(fruits[left]);
                left++;
            }

            maxnum = max(maxnum, right - left + 1);
        }
        return maxnum;
    }
};

2)数组模拟哈希表

数据范围有限的情况下,可以用数组模拟哈希表,提高效率。

cpp 复制代码
class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        int left = 0, right = 0, maxnum = 0;
        int m[100001] = {0};

        for(int kind = 0; right < fruits.size(); right++)
        {
            if(m[fruits[right]] == 0) kind++;
            m[fruits[right]]++;

            while(kind > 2)
            {
                m[fruits[left]]--;
                if(m[fruits[left]] == 0) kind--;
                left++;
            }

            maxnum = max(maxnum, right - left + 1);
        }
        return maxnum;
    }
};
相关推荐
灯澜忆梦28 分钟前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下36 分钟前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J44 分钟前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛1 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有2 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111112 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS2 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b2 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人2 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全
镜子AI4 小时前
教培机构AI推荐系统实战:概念漂移检测算法——为什么“去年有效的推荐今年可能失效“
人工智能·算法