买卖股票的最佳时机III
思路
這道題目相對 121.買賣股票的最佳時機(jī) 和 122.買賣股票的最佳時機(jī)II 難了不少。
關(guān)鍵在于至多買賣兩次,這意味著可以買賣一次,可以買賣兩次,也可以不買賣。
確定dp數(shù)組以及下標(biāo)的含義
一天一共就有五個狀態(tài),
0.沒有操作
1.第一次買入
2. 第一次賣出
3. 第二次買入
4. 第二次賣出
dp[i][j]中 i表示第i天,j為 [0 - 4] 五個狀態(tài),dp[i][j]表示第i天狀態(tài)j所剩最大現(xiàn)金。
確定遞推公式
需要注意:dp[i][1],表示的是第i天,買入股票的狀態(tài),并不是說一定要第i天買入股票。
達(dá)到dp[i][1]狀態(tài),有兩個具體操作:
- 操作一:第i天買入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
- 操作二:第i天沒有操作,而是沿用前一天買入的狀態(tài),即:dp[i][1] = dp[i - 1][1]
那么dp[i][1]究竟選 dp[i-1][0] - prices[i],還是dp[i - 1][1]呢?
一定是選最大的,所以
dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);
同理dp[i][2]也有兩個操作:
- 操作一:第i天賣出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
- 操作二:第i天沒有操作,沿用前一天賣出股票的狀態(tài),即:dp[i][2] = dp[i - 1][2]
所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
同理可推出剩下狀態(tài)部分:
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
dp數(shù)組如何初始化
第0天沒有操作,這個最容易想到,就是0,即:dp[0][0] = 0;
第0天做第一次買入的操作,dp[0][1] = -prices[0];
第0天做第一次賣出的操作,這個初始值應(yīng)該是多少呢?
首先賣出的操作一定是收獲利潤,整個股票買賣最差情況也就是沒有盈利即全程無操作現(xiàn)金為0,
從遞推公式中可以看出每次是取最大值,那么既然是收獲利潤如果比0還小了就沒有必要收獲這個利潤了。
所以dp[0][2] = 0;
第0天第二次買入操作,初始值應(yīng)該是多少呢?
不用管第幾次,現(xiàn)在手頭上沒有現(xiàn)金,只要買入,現(xiàn)金就做相應(yīng)的減少。
所以第二次買入操作,初始化為:dp[0][3] = -prices[0];
同理第二次賣出初始化dp[0][4] = 0;
確定遍歷順序
從遞歸公式其實已經(jīng)可以看出,一定是從前向后遍歷,因為dp[i],依靠dp[i - 1]的數(shù)值。
舉例推導(dǎo)dp數(shù)組
以輸入[1,2,3,4,5]為例
大家可以看到紅色框為最后兩次賣出的狀態(tài)。
現(xiàn)在最大的時候一定是賣出的狀態(tài),而兩次賣出的狀態(tài)現(xiàn)金最大一定是最后一次賣出。
所以最終最大利潤是dp[4][4]
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n * 5)
總結(jié)
以上是生活随笔為你收集整理的买卖股票的最佳时机III的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 买卖股票的最佳时机II
- 下一篇: 买卖股票的最佳时机IV