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

121买卖股票的最佳时机

链接:LeetCode121买卖股票的最佳时机
题目中“只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票”的意思是说,只能拥有一只股票,在某一天拥有,在不同的一天卖出。

第一版

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> dpin(prices.size(),0);//记录0-i天中最低的买入价格
        dpin[0] = prices[0];
        vector<int> dpout(prices.size(),0);//记录0-i天中最高的利润
        int ans = 0;
        for(int i=1;i<prices.size();++i){
            dpin[i] = min(dpin[i-1],prices[i]);
            dpout[i] = prices[i] - dpin[i-1];
            ans = ans>dpout[i]?ans:dpout[i];
        }
        return ans;
    }
};

第二版

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //dp[i][0]表示0-i天中买入的最低价格,dp[i][1]表示0-i天中卖出的最高利润
        vector<vector<int>> dp(prices.size(),vector<int>(2,0));
        dp[0][0] = prices[0];
        int ans = 0;
        for(int i=1;i<prices.size();++i){
            dp[i][0] = min(dp[i-1][0],prices[i]);
            dp[i][1] = prices[i] - dp[i-1][0];
            ans = ans>dp[i][1]?ans:dp[i][1];
        }
        return ans;
    }
};

优化

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //dp[i][0]表示0-i天中买入的最低价格,dp[i][1]表示0-i天中卖出的最高利润
        vector<int> dp(prices.size(),0);
        int in = prices[0];
        int ans = 0;
        for(int i=1;i<prices.size();++i){
            dp[i] = prices[i] - in;
            in = min(in,prices[i]);
            ans = ans>dp[i]?ans:dp[i];
        }
        return ans;
    }
};

刚开始写该题的时候,我采用的是两个for循环,第一个循环记录卖出股票的那一天,第二个循环记录前一天买入股票的那一天,两个循环游标指向的价格做减法得出买卖股票的利润。时间复杂度为O(n^2),当数据量很大的时候会超出时间限制范围。所以以上两版代码对获取0-i天最低的买入价格做了一个优化,将其放入一个dp数组当中,将两个for循环优化为一个for循环。

122买卖股票的最佳时机||

链接:LeetCode买卖股票的最佳时机||

贪心

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

动态规划

本题“在每一天,可以决定是否购买 ’和\或‘ 出售股票,任何时候最多只能持有一股股票,可以先购买,然后在同一天售出,或者之后的某一天售出。“ 相比于”121.买卖股票的最佳时机“本题可以不同时拥有多只股票。
动规五部曲

  1. 确定dp数组下标及含义。dp[i]表示0-i天中买入卖出获取的最高利润。(由于可多次持股,所以利润可以累加)
  2. 确定递推公式。if(prices[i]-prices[i-1] > 0)dp[i] = dp[i-1] +prices[i] - prices[i-1];
  3. 数组初始化。dp[0] = 0;
  4. 确定遍历顺序。从前往后遍历
  5. 举例推导dp数组。
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> dp(prices.size(),0);
        int ans = 0;
        for(int i=1;i<prices.size();++i){
            int dis = prices[i] - prices[i-1];
            dp[i] = dp[i-1] + (dis>0?dis:0);
            ans = ans>dp[i]?ans:dp[i];
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值