123. Best Time to Buy and Sell Stock III

     这几天leetcod刷题没有断过,easy和medium一般没有啥好说的,思路一般都还比较简单,今天主要对123这道题进行分析,其实这道题最大的难点在于有限的交易次数和不可同时持有两个股份,时间复杂度是O(n),空间复杂度是O(n)的思路还是比较简单的,大体上就是有限的几天内找一个点,这个点之前买卖的最高收益加上这点之后买卖的最高收益就是全局最优解,相应的,一个顺序记录最高收益,一个倒序记录最高收益,最后寻找对应的最大和,思路简单粗暴却非常有效。这里就不多说了,直接上代码。

解法一:

4ms

class Solution {
public:
    int maxProfit(vector& prices) {
        int psize = prices.size();
        if(psize<2){
            return 0;
        }
        
        vector forward(psize, 0);
        vector backward(psize, 0);
        int minPrice = prices[0];
        int maxPrice = prices[psize-1];
        int profit = 0;
        
        for(int i=1; i=0; i--){
            backward[i] = max(maxPrice-prices[i], backward[i+1]);
            maxPrice = prices[i]>maxPrice ? prices[i]:maxPrice;
        }
        for(int i=0; i(forward[i]+backward[i]) ? profit:forward[i]+backward[i];
        }
        return profit;
    }
};

        还有一种解法是我看了别人的博客得到的答案,思路更是贴近生活,觉得很有意思,拿来给大家分享,简单粗暴,但是算法细节上的处理还是很有意思的。

       大体上的意思是说,开始的金钱资本是0元,首次买入股票会损失掉一定的钱数,假设第i天买入的,持有资本就是buy1 = -prices[i],当第j天卖出,第一次交易之后,持有的收益就是 sel1 =(-prices[i]+prices[j]),第二次买入假设第k天买入,buy2 = sel1-prices[k],相应的,假设第m天,第二次交易结束,持有的收益,sel2 = buy2+price[m],以此类推,依据这样的思路,代码如下:

方法二:

class Solution {
public:
    int maxProfit(vector& prices) {
        int buy1 = numeric_limits::min();
        int buy2 = numeric_limits::min();
        
        int sel1 = 0;
        int sel2 = 0;
        for(int i=0; i

代码超级简短,代码前两句是表示取极小值,而且题目中说的很清楚,不能同时持有两个股票,因此,代码的顺序应该是先卖再买,这样和常规顺序有矛盾,所以需要用极限最小值去平衡第一次的买卖关系,自己用例子体会一下就可以了。

你可能感兴趣的:(123. Best Time to Buy and Sell Stock III)