123. Best Time to Buy and Sell Stock III
題目網址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
題意:給一整數 array
prices
, 其中第i
個元素代表第i
天的股價。最多完成兩筆交易, 返回最大利潤。
注意:不能同時參與多筆交易(必須在再次購買前出售掉之前的股票)。
Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
prices
前先加上一個0
, 代表什麼元素都沒有的狀態hold1[i]
:第i
天買入第一支股票的最大收益sold1[i]
:第i
天賣出第一支股票的最大收益hold2[i]
:第i
天買入第二支股票的最大收益hold2[i]
:第i
天賣出第二支股票的最大收益2. 得到狀態轉移方程:
hold1[i]
:可由以下兩種狀態轉移
- 第
i - 1
天買入第一支, 第i
天不操作 ➔hold1[i - 1]
- 第
i - 1
天不操作(沒任何股票), 第i
天買入第一支 ➔0 - prices[i]
➔
hold1[i] = max(hold1[i - 1], -prices[i])
sold1[i]
:可由以下兩種狀態轉移
- 第
i - 1
天賣出第一支, 第i
天不操作 ➔sold1[i - 1]
- 第
i - 1
天不操作(買入第一支的狀態), 第i
天賣出第一支
➔hold1[i - 1] + prices[i]
➔
sold1[i] = max(sold1[i - 1], hold1[i - 1] + prices[i])
hold2[i]
:可由以下兩種狀態轉移
- 第
i - 1
天買入第二支, 第i
天不操作 ➔hold2[i - 1]
- 第
i - 1
天不操作(賣出第一支的狀態), 第i
天買入第二支
➔sold1[i - 1] - prices[i]
➔
hold2[i] = max(hold2[i - 1], sold1[i - 1] - prices[i])
sold2[i]
:可由以下兩種狀態轉移
- 第
i - 1
天賣出第二支, 第i
天不操作 ➔sold2[i - 1]
- 第
i - 1
天不操作(買入第二支的狀態), 第i
天賣出第二支
➔hold2[i - 1] + prices[i]
➔
sold2[i] = max(sold2[i - 1], hold2[i - 1] + prices[i])
3. 初始化:
hold1[0]
、sold1[0]
、hold2[0]
、sold2[0]
:沒有股票時, 最大利潤為0
hold1[1]
:第一天買入股票 ➔ 此時的最大利潤為prices[1]
sold1[1]
:在第一天買入, 並且賣出 ➔ 此時的最大利潤為0
hold2[1]
:在第一天買入, 並且賣出, 然後再買入 ➔ 此時的最大利潤為prices[1]
sold2[1]
:在第一天買入, 並且賣出, 然後再買入、再賣出 ➔ 此時的最大利潤為0
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
hold1
,sold1
,hold2
,sold2
Solution 2:
想法:改進 Solution 1, 因為
hold1[i]
,sold1[i]
,hold2[i]
,sold2[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!
評論