904. 水果成籃
阿新 • • 發佈:2018-11-12
在一排樹中,第 i
棵樹產生 tree[i]
型的水果。
你可以從你選擇的任何樹開始,然後重複執行以下步驟:
- 把這棵樹上的水果放進你的籃子裡。如果你做不到,就停下來。
- 移動到當前樹右側的下一棵樹。如果右邊沒有樹,就停下來。
請注意,在選擇一顆樹後,你沒有任何選擇:你必須執行步驟 1,然後執行步驟 2,然後返回步驟 1,然後執行步驟 2,依此類推,直至停止。
你有兩個籃子,每個籃子可以攜帶任何數量的水果,但你希望每個籃子只攜帶一種型別的水果。
用這個程式你能收集的水果總量是多少?
示例 1:
輸入:[1,2,1] 輸出:3 解釋:我們可以收集 [1,2,1]。
示例 2:
輸入:[0,1,2,2] 輸出:3 解釋:我們可以收集 [1,2,2]. 如果我們從第一棵樹開始,我們將只能收集到 [0, 1]。
示例 3:
輸入:[1,2,3,2,2] 輸出:4 解釋:我們可以收集 [2,3,2,2]. 如果我們從第一棵樹開始,我們將只能收集到 [1, 2]。
示例 4:
輸入:[3,3,3,1,2,1,1,2,3,3,4] 輸出:5 解釋:我們可以收集 [1,2,1,1,2]. 如果我們從第一棵樹或第八棵樹開始,我們將只能收集到 4 個水果。
提示:
1 <= tree.length <= 40000
0 <= tree[i] < tree.length
雙指標問題
class Solution { public int totalFruit(int[] tree) { int b1=0; int b2=0; int max=0; int count=0; for(int i=0;i<tree.length;i++) { if(tree[i]==tree[b1]||tree[i]==tree[b2]) count++; else { if(b1!=b2)//這個地方說明要將雙指標更換指向目標,重置count { count=1; b1=i-1; while(tree[b1-1]==tree[i-1]) { b1-=1; count++; } b2=i; count++; } else//這個地方,是因為開始時b1,b2指向得都是下標0,也可以在開始之前使b1,b2指向兩棵不同得樹,所以這個地方不用充值count { count++; b2=i; } } max=Math.max(max,count); } return max; } }