● 121. 买卖股票的最佳时机
暴力和贪心都可以解决
主要讲解动态规划
dp数组:我们把dp数组定义为一个二维的vector容器
dp[i][0]表示第i天持有股票手中的金额:它可以是当天买入的也可以是之前买入的
dp[i][1]表示第i天不持有股票手中的金额:可以是当天卖出的也可以是之前卖出的
初始化:
dp[0][0]:第0天就持有股票,说明它第0天买入了股票 此时手中现金为 -peices[0]
dp[0][1]:第0天不持有股票,说明它既没有买入也没有卖出 手中现金为0。
遍历顺序:从前往后 后一天由前一天推导出。
递推公式:
dp[i][0]=max(dp[i-1][0],prices[i])
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);
最后返回值:就是最后一天不持有股票的手中的最大现金
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size()+1,vector<int>{0,0});
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i = 1;i<prices.size();i++){
dp[i][0] = max(dp[i-1][0],-prices[i]);//第i天不持有股票的最大金额
dp[i][1] = max(dp[i-1][1],prices[i]+dp[i-1][0]);//第i天持有股票的最大金额
}
return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);
}
};
● 122.买卖股票的最佳时机II
与上一题的唯一区别就是 股票可以买卖多次,递推公式的时候略微有点变化
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i]);
是由前一天持有股票,或者前一天不持有股票今天买入的最大值组成 ,此时前一天不持有股票手中现金不再是0而是dp[i-1][1]
dp[i][1]与上一道题完全相同。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size()+1,vector<int>{0,0});
dp[0][0] = -prices[0];
dp[0][1] = 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[prices.size()-1][1];
}
};