题目解析
904. 水果成篮
算法讲解
这道题的本质就是:寻找一段连续的区域(子数组),这一段连续的区域里面最多包含两种水果,因为有可能这一段连续的区域里面全是一种水果,比如:f(x) = {1,1,1,1,1,1,1}
我们这道题需要使用一个数据结构Hash
,使用Hash是为了更方便 快捷的寻找出这一种水果的数量;
但我们cont大于两种水果的时候,说明我们已经找到了这一段连续的区间,只不过需要继续往后面走,看看有没有更合适的,所以就需要继续移动窗口
class Solution {
public:int totalFruit(vector<int>& nums) {//寻找子数组,子数组中包含不超过两个种类的水果 有可能全部都是same数int left = 0, right = 0;//数组的长度最大到10^5int Hash[100000] = {0};int n = nums.size();int count = 0; //记录种类个数int ret = 0;while(right < n){if(Hash[nums[right]] == 0)count++;Hash[nums[right]]++;//走到这里,说明已经遇到了第三种水果while(count > 2){Hash[nums[left]]--; if(Hash[nums[left]] == 0)count--;left++;}ret = max(ret, right - left + 1);right++;} return ret;}
};