一 .滑动窗口+哈希表的方法
先给出代码:
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(窗口长度)