力扣刷題Python筆記:最佳買賣股票時機含冷凍期
阿新 • • 發佈:2020-12-24
技術標籤:力扣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]