121. 买卖股票的最佳时机
题目链接:121. 买卖股票的最佳时机
dp
数组:dp[i][0]
表示第i
天持有股票得到的最大金额,dp[i][1]
表示第i
天不持有股票得到的最大金额
递推公式:
dp[i][0] = max(dp[i - 1][0], -prices[i])
dp[i - 1][0]
表示前一天就持有股票,i
天没有买入,也没有卖出-prices[i]
表示i
天买入的股票(股票只能买一次)
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
dp[i - 1][1]
表示前一天就不持有股票,i
天没有买入,也没有卖出dp[i - 1][0] + prices[i]
表示i - 1
天持有股票,第i
天卖出
初始化:
dp[0][0] = -prices[0], dp[0][1] = 0
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(), {-prices[0], 0});//初始化
for (int i = 1; i < prices.size(); ++i) {
dp[i][0] = max(dp[i - 1][0], -prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return dp.back()[1];//一定是手里没有股票的钱多
}
};
dp
数组可以只用一维数组。原理就像01背包中的二维数组变成一维数组一样。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dp{-prices[0], 0};
for (int i = 1; i < prices.size(); ++i) {
dp[0] = max(dp[0], -prices[i]);
dp[1] = max(dp[1], dp[0] + prices[i]);
}
return dp.back();
}
};
122.买卖股票的最佳时机II
题目链接:122.买卖股票的最佳时机II
与上一题唯一的区别:
递推公式:
dp[i][0] = max(dp[i-1][0], dp[i - 1][1] - prices[i])
dp[i - 1][0]
表示前一天就持有股票,i
天没有买入,也没有卖出dp[i - 1][1] - prices[i]
表示i
天买入的股票
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(), {-prices[0], 0});
for (int i = 1; i < prices.size(); ++i) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return dp.back()[1];
}
};
一维数组
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dp{-prices[0], 0};
for (int i = 1; i < prices.size(); ++i) {
dp[0] = max(dp[0], dp[1] - prices[i]);
dp[1] = max(dp[1], dp[0] + prices[i]);
}
return dp.back();
}
};