面试必刷算法TOP101之买卖股票问题 TOP16
一個思路解決下邊買賣股票的問題
首先先分析下邊的問題
121. 買賣股票的最佳時機 I 限定交易次數 k=1
122. 買賣股票的最佳時機 II 交易次數無限制 k = N
123. 買賣股票的最佳時機 III 限定交易次數 k=2
124. 買賣股票的最佳時機 IV 限定交易次數 最多次數為 k k還是有限制的
這些問題都是買賣股票的最佳時機,都是在通過買賣股票的來獲取最大差值大,但是最大區別就是買賣股票的次數都是不一樣的,所以將這些問題看作是一個問題,只不過是對于不同問題交易次數是不同的,因為是動態規劃問題還是使用PD的解題步驟來解決問題:
(1)創建dp數組明確下標的含義
創建一個三維數組dp[i][k][j]其含義是在第i天剩余叫次數還有k次,對于j來說不是0就是1,0代表沒有股票,1代表持有股票,具體含義如下:
dp[i][k][0] 第i天 還可以交易k次 手中沒有股票
dp[i][k][1] 第i天 還可以交易k次 手中有股票
最后的結果應該是dp[i][k][0]手中應該沒有持有股票,因為最后一天持有股票的化沒有賣出其收益肯定不是最高的
(2)遞推公式
因為定義dp數組時定義第i天持有股票和沒有持有股票所以分為兩種情況
第i天沒有持有股票,可以分為兩種情況
遞推公式為:dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + cost[i])
// 今天沒有持有股票,分為兩種情況
// 1. dp[i - 1][k][0],昨天沒有持有,今天不操作。
// 2. dp[i - 1][k][1] + prices[i] 昨天持有,今天賣出,今天手中就沒有股票了。
第i天持有股票,可以分為兩種情況
遞推公式為:p[i][k][1] = max(dp[i - 1][k][1], dp[i - 1][k - 1][0] - cost[i]
// 今天持有股票,分為兩種情況:
// 1.dp[i - 1][k][1] 昨天持有,今天不操作
// 2.dp[i - 1][k - 1][0] - prices[i] 昨天沒有持有,今天買入。
最大利益就是將持股與不持股情況比較去一個最大值
(3)初始化‘
每個問題的情況不一樣初始化也是不樣的
(4)遍歷順序
因為都是前邊買入后邊賣出所以遍歷方式自然就是從前往后
股票問題以之 買賣股票的最佳時機Ⅰ
題目來源:Leetcode
1、問題描述
給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。
在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。
返回 你能獲得的 最大 利潤 。
2、轉移方程式
前邊已經總結出來大的思路但是每一個問題,還有一些是不同的針對這個問題還是要具體分析
轉移方程
//第i天不持有 由 第i-1天不持有然后不操作 和 第i-1天持有然后賣出 兩種情況的最大值轉移過來
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + cost[i])
//第i天持有 由 第i-1天持有然后不操作 和 第i-1天不持有然后買入 兩種情況的最大值轉移過來
dp[i][1][1] = Math.max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])
= max(dp[i - 1][1][1], -cost[i]) // k=0時 沒有交易次數,dp[i - 1][0][0] = 0
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - cost[i]
dp[i][[1] = max(dp[i - 1][1], cost[i]) k=0時 沒有交易次數,dp[i - 1][0][0] = 0
簡化為一個二為數組但是結果還是不影響
3.代買實現
``
class Solution {
public:
};
前邊代碼dp[i]之與dp[i-1]有關可以將dp數組降維到一維數組```kotlin int maxProfit(vector<int>& prices) {int n = prices.size();int dp[2];dp[0] = 0;dp[1] = -prices[0];//因為第0天買入的話就持股就是-prices[0]for (int i = 1; i < n; ++i) {dp[0] = max(dp[0], dp[1] + prices[i]);dp[1] = max(dp[1], - prices[i]);}return dp[0];}股票問題以之 買賣股票的最佳時機Ⅱ
題目來源:Leetcode
1、問題描述
給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。返回 你能獲得的 最大 利潤 。2、轉移方程式
//第i天不持有 由 第i-1天不持有然后不操作 和 第i-1天持有然后賣出 兩種情況的最大值轉移過來
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + cost[i])
//第i天持有 由 第i-1天持有然后不操作 和 第i-1天不持有然后買入 兩種情況的最大值轉移過來
dp[i][1][1] = Math.max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - cost[i]
dp[i][[1] = max(dp[i - 1][1], dp[i - 1][0][0] -cost[i])
3代碼實現
int maxProfit(vector<int>& prices) {int n = prices.size();int dp[2];dp[0] = 0;dp[1] = -prices[0];//因為第0天買入的話就持股就是-prices[0]for (int i = 1; i < n; ++i) {dp[0] = max(dp[0], dp[1] + prices[i]);dp[1] = max(dp[1], - prices[i]);}return dp[0];}買賣股票的最佳時機Ⅲ
題目來源:Leetcode
1、問題描述
給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
2、轉移方程式
//第i天不持有 由 第i-1天不持有然后不操作 和 第i-1天持有然后賣出 兩種情況的最大值轉移過來
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + cost[i])
//第i天持有 由 第i-1天持有然后不操作 和 第i-1天不持有然后買入 兩種情況的最大值轉移過來
dp[i][1][1] = Math.max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])
K對結果有影響不能舍棄
對其循環
先寫出i為2和1時的結果
i為2時
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + cost[i])
dp[i][1][1] = Math.max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])
還是這樣
.
…
i為1時
就成了買賣股票的最佳時機的情況
因為當k==0時沒有交易次數,dp[i - 1][0][0] = 0所以就會出現如下情況;
dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i])
= max(dp[i - 1][1][1], -cost[i])
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + cost[i])
去掉中間這一維
dp[i][1][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i])
= max(dp[i - 1][1], -cost[i])
dp[i][1][0] = max(dp[i - 1][0], dp[i - 1][1] + cost[i])
3代買實現
//和前面一樣 我們直接降維int maxProfit(vector<int>& prices) {int buy_1 = -prices[0], sell_1 = 0;int buy_2 = -prices[0], sell_2 = 0;int n = prices.size();for (int i = 1; i < n; i++) {sell_2 = max(sell_2, buy_2 + prices[i]);buy_2 = max(buy_2, sell_1 - prices[i]);sell_1 = max(sell_1, buy_1 + prices[i]);buy_1 = max(buy_1, -prices[i]);}return sell_2;}總結
以上是生活随笔為你收集整理的面试必刷算法TOP101之买卖股票问题 TOP16的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是robots.txt文件?
- 下一篇: 导盲机器人 英语作文_雷军这回OK了!小