1. 程式人生 > >LeeCode 904 水果成籃

LeeCode 904 水果成籃

在一排樹中,第 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

沒啥說的,使用HashMap實現滑動視窗,程式碼如下:

    public int totalFruit(int[] tree) {
        int head=0;
        int tail=0;
        int max = 0;
        int len = tree.length;
        Map<Integer,Integer> map = new HashMap<>();
        while(head<len&&tail<len){
            if(!map.containsKey(tree[tail])){
                if(map.size()<2){
                    max = tail-head+1>max?tail-head+1:max;
                    map.put(tree[tail],1);
                    tail++;
                }else{
                    if(map.get(tree[head])>1){
                        map.put(tree[head],map.get(tree[head])-1);
                        head++;
                    }else{
                        map.remove(tree[head]);
                        head++;
                    }
                }
            }else{
                max = tail-head+1>max?tail-head+1:max;
                map.put(tree[tail],map.get(tree[tail])+1);
                tail++;
            }
        }
        return max;
    }