309. Best Time to Buy and Sell Stock with Cooldown
題目網址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
題意:給一 array
prices, 其中prices[i]代表第 i 天的股票價格, 在滿足下列條件的前提下, 盡可能地完成更多的交易, 計算出最大利潤。
- 賣出股票後, 你沒辦法在下一天買入股票(冷凍期為一天)
- 不能同時參與多筆交易, 必須在再次購買前出售掉之前的股票

Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
prices前先加上一個0, 代表什麼元素都沒有的狀態rest[i]代表第i天手上未持有股票, 且狀態為rest的最大收益hold[i]代表第i天手上持有股票, 且狀態為hold的最大收益
(手上持有股票然後休息, 其狀態仍是hold。rest狀態必須在未持有股票時)sold[i]代表第i天手上未持有股票, 且狀態為sold的最大收益2. 根據下圖, 可得狀態轉移方程:
rest[i] = max(rest[i - 1], sold[i - 1])
hold[i] = max(hold[i - 1], rest[i - 1] - prices[i])
sold[i] = hold[i - 1] + prices[i]
3. 初始化:
hold[0]、sold[0]、rest[0]:沒有股票時, 最大利潤為0hold[1]:第一天買入 ➔ 此時最大利潤為prices[1]sold[1]:第一天買入, 並且賣出 ➔ 此時最大利潤為0rest[1]:第一天不操作 ➔ 此時最大利潤為0
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
hold,sell和rest
Solution 2:
想法:改進 Solution 1, 因為
hold[i]、sold[i]、rest[i]只會用到i - 1的狀態, 因此只要儲存i - 1的狀態即可, 根本不需要開到 $O(n)$ space
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論
