【LeetCode刷题】Day 9
题目1:904. 水果成篮
思路分析:
-
对于滑动窗口来说,我们会慢慢感觉滑动窗口并不难,就拿这道题来说,难的不是算法,而是怎么记录
-
果篮中已经装了多少种:
主要是判断种类是否超过两种,出窗口判断时需要; -
每种种类已经选择了多少棵树:
出窗口时,需要判断是否已经将该种树出完,种类数量才知道是否减少。 -
果篮所选种类是什么:
我们要支持果篮中种类的树进入窗口,就需要比对是否是果篮中记录的两种种类的树。
果篮中已经装了多少种
和
每种种类已经选择了多少棵树
以及
果篮所选种类是什么
。这三个点如果用
unordered_map<int,int>
来处理也是很简单,但频繁的删除,效率很低。
如何替换?根据题目给出的提示我们知道这个fruits[i]<=105 ,所以只用数组hash[100001]
就可以记录所选种类
以及已经选择种类的棵数
。再用int kinds
来记录种类数量
就可以了
思路1:暴力枚举+哈希表
思路2:窗口滑动+哈希表
-
本题的滑动窗口分析:
-
进窗口:记录
right
位置的种类数量,数据维护:果篮中的种类数量kinds
。 -
判断:当种类数量
kinds
超过两种,就需要执行出窗口操作。出窗口:去除一个种类的树,让该类树在果篮的棵数变为0,种类数量kinds
减小。 - 更新结果:每进一次符合要求就更新一次。
代码实现:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int hash[100001]={
0};
int left=0,right=0,kinds=0,n=fruits.size();
int ret<