代码随想Day49 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 

买卖股票的通解是使用二维dp数组,为什么需要二维呢?因为需要表示第i天持有股票和不持有股票两种状态的最大值,注意持有不仅仅包括当前买这一种操作,还包括前一天就持有当天不买这种操作。

数组定义

dp[i][0] 第i天持有股票的最大金额;dp[i][1] 第i天不持有股票的最大金额;

递推:

dp[i][0]= max(dp[i-1][0], -price[i]) ->持有的最大利润是前一天持有和当前买的最大值,因为只能交易一次,所以如果当前买的话一定是第一次买,所以利润就是0-price[i];

dp[i][1] = max(dp[i-1][1],dp[i-1][0]+price[i])->不持有的最大利润是前一天不持有和 当天卖中的最大值

初始化:

dp[0][0]=-price[0]; dp[0][1]=0;

遍历:

从i等于1开始遍历

详细代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //只能买卖一次 需要二维dp数组来表示状态
        vector<vector<int>>dp(prices.size(),vector<int>(2,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]);
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);
        }
        return dp[prices.size()-1][1];

    }
};

122.买卖股票的最佳时机II  

这道题和121题目的区别可以多次交易,只要目前手上没有持有股票就可以,因此与上述相比,只需要修改持有股票的递推公式即可:

dp[i][0] = max(dp[i-1][0],dp[i-1][1]-price[i]);

其他与121均相同。

详细代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //和前一道题的区别就是只要不持有就可以买,而不是只有一次交易机会
        vector<vector<int>>dp(prices.size(),vector<int>(2,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];
 
    }
};
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值