【面試題63 股票的最大利潤】
面試題63:股票的最大利潤:假設把某股票的價格按照時間先後順序存儲在數組中,請問買賣該股票一次可能獲得的最大利潤是多少?
思路:動態規劃。
- 明確狀態:本題唯一的變量就是“能夠獲取的最大利潤”
- dp 數組:
dp[i]
表示在第i
天選擇賣出,能夠獲取的最大利潤 - 明確選擇:假設在第
i
天賣出,那麼可以選擇在0~i-1
的任意一天買入,原則是能夠獲得最大利潤 - 狀態間轉移關係:不論第
i
天的股票價格是否高於前一天,都有以下狀態轉移關係:dp[i] = max(0, prices[i]-(prices[i-1]-dp[i-1]))
,利用prices[i-1]-dp[i-1]
可以計算得到前i-1
天內的最低股票價格 - 確定 base case:當
i=0
時,利潤爲 0
注意到狀態轉移公式 dp[i]
僅和 dp[i-1]
有關,所以不需要真的建立 dp 數組,用變量 pre
和 cur
來維護即可。
時間複雜度:
空間複雜度:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices: return 0
n = len(prices)
pre, m = 0, 0
for i in range(1, n):
cur = max(0, prices[i]-(prices[i-1]-pre))
pre = cur
m = cur if cur > m else m
return m