【代码随想录】刷题Day48

1.买卖股票的最佳时机

121. 买卖股票的最佳时机

我能想到的思路

莫名其妙自己写的代码:其实就是依次遍历找最小值,这个dp数组表示最大卖多少,其实也没有什么意义。也就是找最大最小值如果做差

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

动态规划

1.首先明确dp数组的含义:dp[i][0]为当前持有股票的最大金额,dp[i][1]为当前不持有股票的最大金额。这里指的持有不是说要买i位置的股票,而是持有股票这个状态,持有股票的来源可以是现在买入i也可以是从i-1那里持有股继承过来的,那么不持股其实就是没有股票的意思,可以是之前就没买的也可以是现在卖掉之前买的

2.初始化:dp[0][0]=-prices[0]指的是买入0位置的股票花费prices[0],为表示花费取负值;dp[0][1]=0指的是0位置没有买,那么只有一种结果,就是啥也没买,直接等于0

3.dp数组的条件:dp[i][0]是当前持有股票的最大金额,由于只能买一次,那么其实只有两种选择,可以是之前继承的dp[i-1][0];也可以是当下买入的-prices[i]。dp[i][1]当前不持有股票的最大金额,也由于只能卖一次,只有两种状态,一种是继承自上次不持有股票的状态dp[i-1][1];也可以是当前买到上一次的股票dp[i-1][0]+prices[i]。二者都取最大值就能得到所需的,最后返回dp[prices.size()-1][1],因为未持有股票一定比持有股票的现金要高。

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

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

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

我能想到的思路

其实设计成这样就是为了找到当前对于前面有上升趋势的,那么就是可以作为卖出的机会的,那么重点就落在找高度差的形式上。

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

动态规划

与上一题不同的区别在于这次的买卖并非一次,那么我们其实就需要改变dp数组的条件。针对于dp[i][0]当前持有股票的最大金额来源有两个,一个是上一次无持有股票的最大金额加上当前买入的股票dp[i-1][1]-;另一个是上一次持有股票的最大金额dp[i-1][0],即为dp[i][0]=max(dp[i-1][1]-prices[i],dp[i-1][0])。那么针对于dp[i][1]当前无持有股票的最大金额来源有依旧不变,因为卖出靠买入决定,买入一次卖出也只能一次,但是买入的次数多,对应的卖出也变多,因此不需要改变卖出的操作。

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

猜你喜欢

转载自blog.csdn.net/m0_63488627/article/details/131062298