一、题目解析

fruits[i]代表果树的种类,且只有两个篮子,每个篮子只能装单一类型的水果,每个篮子能装的水果总量没有限制,要求返回可以收集的水果最大数。

通过这个示例就可以将问题转化为找出一个最长的子数组的长度,子数组中水果种类不超过两种。
二、算法原理
解法1:暴力枚举+哈希表
通过暴力枚举出所有水果种类不超过两种的所有子数组长度,将水果个数记录在哈希表中,返回最大的水果个数。
解法2:滑动窗口+哈希表
1.left=0,rigth=0;
2.进窗口:把hash的fruits[right]位置的值加1
3.判断:判断hash.size()是否大于2
出窗口:把hash的fruits[left]位置的值减1,并判断hash[fruits[left]]的值是否为0,为0则erase。
4.更新结果:right-left+1,比较得出最大值
可以根据上面的原理自己实现,链接:904. 水果成篮 - 力扣(LeetCode)
三、代码示例

这里是做了优化的,虽然时间复杂度为O(N),但是哈希表插入数据和删除数据会浪费时间。在观察了数据量在10^5,可以开一个数组记录个数,然后用kinds维护水果种类,进窗口kinds++,在删除时,kinds--,从原来的76ms->4ms。
看到最后,如果对您有帮助,请留下一个免费的赞,期待下期再见!
