代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II

121. 买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机

比较好想到的是贪心算法,贪心选择价格更低的日子买入,价格更高的日子卖出。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int low = INT_MAX;
        int result = 0;
        for(int i = 0; i < prices.size(); ++i){
            low = min(low, prices[i]);
            result = max(result, prices[i] - low);
        }
        return result;
    }
};

动态规划算法不太好想到:

(1)dp[ i ][ 0 ] 表示第 i 天持有股票时,手上的最大金额;

        dp[ i ][ 1 ] 表示第 i 天不持有股票时,手上的最大金额;

        初始手上金额为 0,持有股票说明当前已经买入了股票,则手上金额为负;

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

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

(3)dp[ 0 ][ 0 ] = -prices[ i ]; dp[ 0 ][ 1 ] = 0;

(4)按天遍历;

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(2, vector<int>(2, 0));
        // dp[i][0]表示第i天持有股票时,手中的最大金额;
        // dp[i][1]表示第i天不持股票时,手中的最大金额;
        dp[0][0] = -prices[0];
        for(int i = 1; i < prices.size(); ++i){
            dp[i % 2][0] = max(dp[(i-1) % 2][0], -prices[i]);
            dp[i % 2][1] = max(dp[(i-1) % 2][1], dp[(i-1) % 2][0] + prices[i]);
        }
        return dp[(prices.size() - 1) % 2][1];
    }
};

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

题目链接:122. 买卖股票的最佳时机 II

贪心算法之前做过了;本题的动态规划方法就比较传统:

(1)dp[ i ] 表示前 i 天能得到的最大利润;

(2)dp[ i ] = max( dp[ i - 1], dp[ i - 1 ] + prices[ i ] - prices[ i - 1 ] );

(3)dp[ 0 ] = 0;

(4)按天遍历;

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> dp(prices.size(), 0);
        dp[0] = 0;
        for(int i = 1; i < prices.size(); ++i){
            dp[i] = max(dp[i - 1], dp[i - 1] + prices[i] - prices[i - 1]);
        }
        return dp[prices.size() - 1];
    }
};

当然也可以按照买卖股票的最佳时机的思路来:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(2, vector<int>(2, 0));
        dp[0][0] = -prices[0];
        for(int i = 1; i < prices.size(); ++i){
            dp[i % 2][0] = max(dp[(i-1) % 2][0], dp[(i-1) % 2][1] - prices[i]);
            dp[i % 2][1] = max(dp[(i-1) % 2][1], dp[(i-1) % 2][0] + prices[i]);
        }
        return dp[(prices.size() - 1) % 2][1];
    }
};

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值