打卡第五天:水果成篮(滑动窗口)

该算法问题通过双指针法解决,使用一个哈希表记录当前窗口内的水果种类和数量。当窗口内水果种类超过2种时,慢指针向右移动并减少对应水果的数量,直至窗口内水果种类不超过限制。最终返回最长满足条件的子数组长度。

题目描述

在这里插入图片描述
实际上就是说找到一个最长的子数组,数组内只能有两种数字。

思路:跟昨天一样,用双指针解决,一个指针走得快遍历数组,另一个慢指针走得慢。需要注意的是本题有水果种类的限制,因此需要定义一个数组充当哈希表的作用来保存现如今窗口内的数字种类与数字数量。

注意:
1.fruitsType[fruits[fast]]++这个操作是每一次循环必须执行的,无需判断条件,因为要把数字存起来。
2.typeSum>2时,不能直接fruitsType[fruits[slow]]=0;这种赋0操作,因为slow要一步步遍历后面的数组,直到出现有数字数量为0才会进入下一次循环。如数组{3,3,1,2}读到2的时候typesum>2,若直接fruitsType[fruits[slow]]=0,下一个slow读的还是3,此时子数组{3,1,2,},仍然是错误的。

int totalFruit(int* fruits, int fruitsSize)
{ 
    int fast = 0;
    int slow = 0;
    int fruitsType[100000] = { 0 };
    //定义一个数组来保存现在窗口内有多少个数字和有多少种数字
    int typeSum = 0;
    //滑动窗口内的种类之和
    int result = 0;
    //最后返回的结果
    for (fast = 0, slow = 0; fast < fruitsSize; fast++)
    {
        if (fruitsType[fruits[fast]] == 0)
        //如果这个数字没出现过,就让typesum++
        {
            typeSum++;
        }
        fruitsType[fruits[fast]]++;
        //让该数组中数字对应的位置++,有就++
        if (typeSum > 2)
        //种类大于2,即不符合题目要求时
        {
            fruitsType[fruits[slow]]--;
            //让慢指针对应的数字数量--
            if (fruitsType[fruits[slow]] == 0)
            //当出现slow指向的数字数量为0时,就是没有这个数字了嘛,typesum--
            {
                typeSum--;
            }
            //slow不断++,因为要一个一个减去fruitsType里的数字。
            slow++;
            
        }
        //简单的判断,与昨天同理
        int length = fast - slow + 1;
        result = result > length ? result : length;
    }
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值