題目連結:
題目意譯:
你正參觀一座農場,其有一列的果樹從左排到右。這些樹會以一個整數陣列 fruits 表示,其中 fruits[i] 為第 i 棵樹的水果種類。
你想要採集儘可能多的水果。不過,農場的主人有著一些規則你需要去遵守:
你只有兩個水果籃,並且每一個籃子只能裝一種水果。每一個籃子可以容納的水果數量不受限制。
從你選定的任意一棵樹開始,你必須從每一棵樹採下恰好一顆水果(包含起點的那一棵樹)並持續地往右移動。採集下來的水果必須可以裝進你的其中一個籃子中。
只要你遇到某一棵有著沒辦法裝進你的籃子之水果,則此時你必須停止採集。
給定整數陣列 fruits,回傳你可以採集的最大水果量。
限制:
1 ≦ fruits.length ≦ 10 ^ 5
0 ≦ fruits[i] < fruits.length
範例測資:
範例 1:
輸入: fruits = [1,2,1]
輸出: 3
解釋: 我們可以採集所有樹的水果。
範例 2:
輸入: fruits = [0,1,2,2]
輸出: 3
解釋: 我們可以從 [1,2,2] 這些樹中挑水果。
如果我們從第一棵樹開始,我們將只能挑到 [0,1] 這些樹。
範例 3:
輸入: fruits = [1,2,3,2,2]
輸出: 4
解釋: 我們可以從 [2,3,2,2] 這些樹中挑水果。
如果我們從第一棵樹開始,我們將只能挑到 [1,2] 這些樹。
解題思維:
典型的滑動視窗(Sliding Window)之題型,如
這題。
假設我們知道從第一棵樹開始(即 fruits[0])可以挑到哪個位置,稱其為 R0(這個值可以直接模擬掃過求得)。
則我們可以一直往「下一個位置」(設現在為 i,i > 0)推得如果從位置 i 開始的話可以挑到哪個位置,稱其為 Ri。可以看到 Ri-1 ≦ Ri。所以可以直接從 Ri-1 開始看可不可以繼續挑水果(記得把 fruits[i - 1] 的水果排除,因為現在要從 fruits[i] 開始)。
而過程中的任意位置中挑得的最大水果數即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。