904. 水果成篮(day 6)

一 .滑动窗口+哈希表的方法 

先给出代码:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int n =fruits.size();
        int kind = 0;
        int hash[100001] = {0};//定义一个哈希表
        int result = 0;
        for(int left=0,right=0;right<n;++right)
        {
            if(hash[fruits[right]]==0)
            kind++;
            hash[fruits[right]]++;//以水果的种类为键,以篮子中水果的数量为值,进入窗口
            while(kind>2){
                hash[fruits[left]]--;//减小该水果的值
                left++;//左指针右移,退出窗口
                if(hash[fruits[left-1]]==0)//如果该水果不在窗口中了
                kind--;//种类减少,跳出循环,如果该水果还在窗口中那么继续减小窗口
            }
            result = max(result,right - left +1);
        }
        return result;
    }
};

 对于不熟悉哈希表的同学可能不太理解,下面我们以图画的形式解释代码:

我们的哈希表格式如下:

这里请不要被误导,这里的fruits[left]只是种类的标签,可能出现fruits[left] == fruits[right]的情况

这里的哈希表的作用是:确定 kind ,没有其他作用,确保窗口中只有两种水果。

 以数组 fruits = [1,2,3,2,2]为例:

最开始是1,2,此时kinds =2, fruits[left] ==1,fruits[right] ==2,

hash[fruits[right]] ==1,hash[fruits[right]] == 1。

此时kind=3,fruits[left] ==1,fruits[right] ==3,hash[fruits[left]] ==1,hash[fruits[right]] == 1。

准备进入while循环,执行left++;

kind=2,fruits[left] ==2,fruits[right] ==3,hash[fruits[left]] ==1,hash[fruits[right]] == 1

kind=2,fruits[left] ==2,fruits[right] ==2,hash[fruits[left]] ==2,hash[fruits[right]] == 2 

kind=2,fruits[left] ==2,fruits[right] ==2,hash[fruits[left]] ==2,hash[fruits[right]] == 2 

可以看到后面两步,fruits[left] ==fruits[right] ,也就是表示哈希表中同一个键。

计算收集了多少水果,使用right -left+1(窗口长度)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值