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]
:沒有股票時, 最大利潤為0
hold[1]
:第一天買入 ➔ 此時最大利潤為prices[1]
sold[1]
:第一天買入, 並且賣出 ➔ 此時最大利潤為0
rest[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!
評論