問題描述
在一排樹中,第 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;
}
};