在做题中学习(46):水果成篮

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

读题和示例:可转化为求一个最长的子数组,它的数字(水果)种类要  <=2.

解法:同向双指针————>滑动窗口

思路:因为要记录数字(水果)种类,因此需要一个哈希表来做一个下标的映射————>用来存放数字(水果)是何种种类,还需要一个变量记录已有的种类个数。

滑动窗口步骤:

1.left = 0,right = 0.

2.进窗口————>kind[fruits[right]]++

3.判断————>kinsum是否符合要求

4.出窗口+重复判断————>kind[fruits[left]]--

5.更新结果————> 取一个更大的len

class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        int kind[100000] = {0};
        int len = 0,kindsum = 0;
        for(int left = 0,right = 0;right<fruits.size();)
        {
            //先判断是因为哈希表中此位置为0时,代表没有这个种类
            //因此种类需要++
            if(kind[fruits[right]]==0)
            {
                kindsum++;
            }
            //1.进窗口
            kind[fruits[right]]++; 
            //2.判断
            while(kindsum > 2)
            {
                //3.出窗口
                kind[fruits[left]]--;
                //一个数出去后,那个位置重新变为0时,代表这个种类没有了
                //因此这个需要--
                if(kind[fruits[left]]==0)
                {
                    kindsum--;
                }
                left++;
            }
            //4.更新结果
            len = max(len,right - left + 1);
            right++;
        }
        return len;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值