1. 程式人生 > 其它 >力扣刷題Python筆記:最佳買賣股票時機含冷凍期

力扣刷題Python筆記:最佳買賣股票時機含冷凍期

技術標籤:力扣python刷題演算法

題目

給定一個整數陣列,其中第 i 個元素代表了第 i 天的股票價格 。​

設計一個演算法計算出最大利潤。在滿足以下約束條件下,你可以儘可能地完成更多的交易(多次買賣一支股票):

你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
賣出股票後,你無法在第二天買入股票 (即冷凍期為 1 天)。
在這裡插入圖片描述
來源:力扣(LeetCode)

Python解法

動態規劃解法

具體的解題思路如下:

  • 首先計算 prices 的長度 n,如果 n 小於2,那麼直接返回0;
  • 建立一個長度為 n、初始元素為 [0, 0] 的陣列 dp,則可以用 dp[i][0] 來選取陣列的陣列的元素,dp[][] 這兩個框中前面代表天數,後面代表是否持有股票,對應的值就是對應的利潤最大值;
  • dp[i][0] 代表第 i-1 天不持股或者第 i-1 天持股然後第 i 天賣出;
  • dp[i][1] 有所不同,按照正常的理解應該是第 i-1 天持股或者第 i-1 天不持股然後第 i 天持股,但是這裡有一個冷凍期,是需要隔一天的,因此如果你在第 i-1 天不持股那麼在第 i-2 天一定也不能持股,否則第 i-2 天持股在第 i-1 天不持股說明在第 i-1 天賣出,那麼第 i 天是冷凍期,是不允許持股的。因此對於 dp[i][1] 來說,第 i-1 天如果不持股,那麼第 i-2 天也不應該持股,這樣將 第 i-1 天作為冷凍期,第 i 天才能持股;
  • 最後返回dp[-1][0]因為不持股利潤是要大於等於持股的。

程式碼如下:

def maxProfit(self, prices: List[int]) -> int:
    n = len(prices)
    if n < 2: return 0
    dp = [[0,0] for i in range(n)]   #dp的初始化

    dp[0][0] = 0     #第0天不持股自然就為0了
    dp[0][1] = -prices[0]   #第0天持股,那麼價格就是-prices[0]了
    #第1天不持股,要麼第0天就不持股,要麼就是第0天持股,然後第1天賣出
    dp[1][0] = max(dp[0][0],dp[0][1]+prices[
1]) #第一天持股,要麼就是第0天就持股了,要麼就是第0天不持股第1天持股 dp[1][1] = max(dp[0][1],dp[0][0]-prices[1]) for i in range(2,n): dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]) dp[i][1] = max(dp[i-1][1],dp[i-2][0]-prices[i]) return dp[-1][0]