水果成篮_优选算法(C++)滑动窗口
网页直达:
题目解析:
1.我们只能装2种类型的水果.并且我们要使装的水果数量最多,结果是最大数量的水果.
解法一:暴力解法+哈希表
暴力解法可以不写代码,但是要知道思路.
解法二:滑动窗口+哈希表
哈希表用于统计水果的数量和种类.
同样的,我们来画图了解其中的过程:
代码实现:
无解析:
class Solution {
public:int totalFruit(vector<int>& fruits) {unordered_map<int,int> hash;int n=fruits.size();int ret=0;for(int left=0,right=0;right<n;right++){hash[fruits[right]]++;while(hash.size()>2){hash[fruits[left]]--;if(hash[fruits[left]]==0)hash.erase(fruits[left]);left++;}ret=max(right-left+1,ret);}return ret;}
};
详解:
class Solution {
public:int totalFruit(vector<int>& fruits) {unordered_map<int,int> hash;//创建哈希表int n=fruits.size();int ret=0;for(int left=0,right=0;right<n;right++//右指针遍历,入窗口{hash[fruits[right]]++;//统计种类和数量while(hash.size()>2)//当种类大于2时不符合条件{hash[fruits[left]]--;//统计种类和数量if(hash[fruits[left]]==0)hash.erase(fruits[left]);left++;//出窗口}ret=max(right-left+1,ret);//上面的循环走完,就是种类为2的数量最多,更新结果}return ret;}
};
优化:
我们知道容器进行插入删除时需要时间的消耗.在题目中发现水果的种类是最大10^5,所以我们可以使用数组来模拟哈希表.kinds来记录水果种类.
代码实现:
详解:
class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001]={0};//用数组模拟哈希表int kinds=0;//记录水果的种类int n=fruits.size();int ret=0;for(int right=0,left=0;right<n;right++)//右指针遍历,入窗口{if(hash[fruits[right]]==0)//统计种类{kinds++;}hash[fruits[right]]++;while(kinds>2){hash[fruits[left]]--;if(hash[fruits[left]]==0){kinds--;}left++;//出窗口}ret=max(ret,right-left+1);}return ret;}
};