解题思路(个人的思路)

这一题建议先通过第121题之后再来做比较好。我先说一下我个人的思路吧,首先我们需要知道这个题目我们需要追求的是最大的利益,买卖多少次根本不是问题,但是并不代表我们能同时持有多天的股票。我们也是尝试使用一个for把题目解决一下。我们首先设定在第0天的时候,最大价格为0,最小价格为第0天的股票价格,总利润为0(且永远为正)。然后就到了我们的for循环里面了。

首先最大价格一定要大于最小价格才能成交,不然就亏钱了。那么如何判定最大价格呢?我们这里用局部最大,也就是如果当前的最大价格大于当天价格,那这个就是最大价格了。那如果之后有一天的价格比当前的最大价格更高呢?这个问题我们举个例子就懂了:

假如:第一天价格为1,我们买入,第三天价格为10,第四天价格为8,第五天价格为100。我们这个时候该怎么操作比较好?

  1. 从第一天一直持有,到第五天卖出,利润:100 - 1 = 99
  2. 第一天买入,第三天卖出,先获得利润10 -1 = 9,在第四天买入,第五天卖出,获得利润100 - 8 = 92,总利润 92 + 9 = 101

这就很好懂了吧,所以我们只需要获得局部的最大价格即可卖出,再之后买入就行了。

代码(个人的思路)

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

解题思路 ( 官方的思路 )

其实差不多,也是某程度上获得局部最大价格,只是官方的思路更加简单直接,如果当天的股票价格比前一天的高就直接卖出,如果比前一天的低我们就不卖。这里要注意其实这道题一直不存在买这个概念,我们只是求一个差值而已,明白了指点之后我们自己试一下举个例子就知道官方的思路是有多么高效了。

代码(官方的思路)

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