121. 买卖股票的最佳时机
- 通过二维数组的方式记录前一天持有或不持有股票对当天的影响
- 若当前天不想持有,则前一天若持有,当天获利=前一天的获利+当天卖出的获利;若前一天不持有,则获利就是前一天的获利,两者取max
- 若当前天持有,则前一天若持有,获利即为前一天获利;若前一天不持有,则获利为当前天买入的成本;注意这里,为什么前一天不持有,当前持有的获利不是前一天的获利+当前天的买入成本呢,因为买入卖出只有一次!!!
class Solution {
public:
int maxProfit(vector<int>& prices) {
std::vector<std::vector<int>> dp(prices.size(), std::vector<int>(2, 0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i{1}; i<prices.size(); i++){
dp[i][0] = std::max(dp[i-1][0], dp[i-1][1]+prices[i]);
dp[i][1] = std::max(dp[i-1][1], -prices[i]);
}
return dp[prices.size()-1][0];
}
};
122.买卖股票的最佳时机II
- 上一题第三点的另一种情况,允许多次买入卖出
- 实际也有更简单的方法,直接求增长的差值和
class Solution {
public:
int maxProfit(vector<int>& prices) {
std::vector<std::vector<int>> dp(prices.size(), std::vector<int>(2,0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i{1}; i<prices.size(); i++){
dp[i][0] = std::max(dp[i-1][0], dp[i-1][1]+prices[i]);
dp[i][1] = std::max(dp[i-1][1], dp[i-1][0]-prices[i]);
}
return dp[prices.size()-1][0];
}
};
123.买卖股票的最佳时机III
- 模仿之前的两个例子,在每一天将当前天的所有情况都列出来:第一次买入,第一次卖出,第二次买入, 第二次卖出
- 关于第二次买入卖出的前提条件:理论上第二次买入或卖出肯定需要有第一次的买入卖出
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()<1){
return 0;
}
std::vector<std::vector<int>> dp(prices.size(), std::vector<int>(4, 0));
dp[0][0] = -prices[0];
dp[0][2] = -prices[0];
for(int i{1}; i<prices.size(); i++){
dp[i][0] = std::max(dp[i-1][0], -prices[i]);
dp[i][1] = std::max(dp[i-1][1], dp[i-1][0]+prices[i]);
dp[i][2] = std::max(dp[i-1][2], dp[i-1][1]-prices[i]);
dp[i][3] = std::max(dp[i-1][3], dp[i-1][2]+prices[i]);
}
return dp[prices.size()-1][3];
}
};