问题描述
在一排树中,第 i 棵树产生 tree[i] 型的水果。
你可以从你选择的任何树开始,然后重复执行以下步骤:
- 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
- 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。
请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。
你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。
用这个程序你能收集的水果总量是多少?
示例 1:
输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。
解题报告
使用集合 s
来存储篮子里的水果类型。
- 移动右指针时,往集合中插入元素;
- 当集合中的元素个数大于2时,更新左指针【注意此处是更新左指针,而不是左指针右移】;
- 将左指针指向右指针的前一个元素,查找第一个与当前
tree[l]
不同的元素的下标,将其从集合中删除; - 更新答案,右指针右移一位。
注意:
while(tree[l]==tree[l-1])
此处不需要加条件 l>0
,因为在集合中的元素大于 2
的时候才开始执行查找,查找结束 l
必然是大于 1
的。
实现代码
class Solution{
public:
int totalFruit(vector<int>&tree){
set<int>s;
int ans=0,l=0,r=0;
while(r<tree.size()){
s.insert(tree[r]);
if(s.size()>2){
l=r-1;
while(tree[l]==tree[l-1])l--;
s.erase(tree[l-1]);
}
ans=max(ans,r-l+1);
r++;
}
return ans;
}
};