ETH官方钱包

前往
大廳
主題

LeetCode - 0904. Fruit Into Baskets 解題心得

Not In My Back Yard | 2024-01-07 12:00:07 | 巴幣 0 | 人氣 106

題目連結:


題目意譯:
你正參觀一座農場,其有一列的果樹從左排到右。這些樹會以一個整數陣列 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] 開始)。

而過程中的任意位置中挑得的最大水果數即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作