前往
大廳
主題

LeetCode - 123. Best Time to Buy and Sell Stock III 解題心得

Not In My Back Yard | 2022-04-02 00:00:04 | 巴幣 204 | 人氣 397

題目連結:


題目意譯:
你被給定一陣列 prices 其中 prices[i] 代表著第 i 天某特定股票之價格。

計算你最大可獲得之利潤。你最多只能完成兩次的交易。


注:你不能同時進行多個交易(即再次買入股票前,必須賣掉現有的)。

限制:
1 ≦ prices.length ≦ 10 ^ 5
0 ≦ prices[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: prices = [3,3,5,0,0,3,1,4]
輸出: 6
解釋: 於第 4 天買入(價格 = 0),然後於第 6 天(價格 = 3)賣出,利潤 = 3 - 0 = 3。
接著於第 7 天買入(價格 = 1),然後於第 8 天賣出(價格 = 4),利潤 = 4 - 1 = 3。

範例 2:
輸入: prices = [1,2,3,4,5]
輸出: 4
解釋: 於第 1 天買入(價格 = 1),然後於第 5 天(價格 = 5)賣出,利潤 = 5 - 1 = 4。
注意你於第一天買入,於第二天再次買入並於之後賣出,因為此時你同時進行多筆交易。
你需先在再次買入前賣出。

範例 3:
輸入: prices = [7,6,4,3,1]
輸出: 0
解釋: 這個例子,沒有任何交易成立,即最大利潤 = 0。


解題思維:
類似幾天前的股價問題(這題),我們可以畫出狀態轉移圖,如下圖:
其中:
S0 代表第一次可以買入股票的狀態、
S1 代表第一次可以賣出股票的狀態、
S2 代表第二次可以買入股票的狀態、
S3 代表第二次可以賣出股票的狀態、
R 代表不能在進行任何買賣的狀態(也就是交易已滿兩次)。

然後就如同該題算出每一天每種狀態下的最大獲利,取其中的最大值即是所求。




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

創作回應

ChiChi0811
範例2的利潤那邊好像有錯字,還有請問更改狀態轉移的順序會有影響ㄇ
2022-04-04 14:04:24
Not In My Back Yard
不好意思,我看到了:「5 - 1 = 1」XD
已修改。
2022-04-04 18:03:17
Not In My Back Yard
請問「更改狀態轉移的順序」是什麼意思呢?
原先我是從前一天推到下一天,現在要反過來?或是 S0 、 S1 …… 等等的計算順序?
2022-04-04 18:05:04
ChiChi0811
S0,S1…的計算順序
2022-04-04 18:27:52
Not In My Back Yard
如果是按照我的程式碼那樣子的話:
原本應該要是把每個狀態宣告成長度為 prices.length + 1 的陣列用來代表每一天的狀態,因為我為了省掉不必要的空間,所以變成那個樣子。
2022-04-04 18:35:47
Not In My Back Yard
也就是先計算 S3 再 S2 等等。這是因為根據狀態圖中的依賴關係:例如我們可以看到要計算 S3 會需要 S2 和 S3 本身,所以我們先動到 S2 的話,此時再去算 S3 的值會有錯誤。
2022-04-04 18:37:15
ChiChi0811
喔喔了解了,感謝解釋
2022-04-04 18:58:07

更多創作