码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode——Best Time to Buy and Sell Stock III

时间:2015-01-20 23:46:30      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

思路:将两段最大的利润相加,一段的最大利润不一定只在一个上升期内,例如在绿线间就有两个上升区间

        只要算出i之前的最大利润和i之后的最大利润相加就行,因为i不可能同时是峰值或者谷值,所以能保证不是在同一天买进和卖出

 

技术分享

绿线的利润加上红线利润是最大利润。

class Solution {
    // 算出利润最大的两段
    // 算出i之前最大的利润和i之后最大的利润
    // l[]: i之前最大的利润
    // r[]: i之后最大的利润
    // minVal: i之前最小值
    // maxVal: i之后最大值
public:
    int maxProfit(vector<int> &prices) {
        if(prices.empty()) return 0;
        const int size = prices.size();
        int l[size], r[size], minVal(prices[0]), maxVal(prices[size-1]);
        // 算出i之前的最大利润
        l[0] = 0;
        for(int i = 1; i < size; i ++){
            l[i] = max(l[i-1], prices[i] - minVal);
            minVal = min(prices[i], minVal);
        }
        // 算出i之后的最大利润
        r[size-1] = 0;
        for(int i = size-2; i >= 0; i --){
            r[i] = max(r[i+1], maxVal - prices[i]);
            maxVal = max(maxVal, prices[i]);
        }
        // 算出总的最大利润
        int profit(0);
        for(int i = 0; i < size; i ++){
            profit = max(profit, l[i] + r[i]);
        }
        return profit;
        
    }
};

leetcode——Best Time to Buy and Sell Stock III

标签:

原文地址:http://www.cnblogs.com/skysand/p/4237590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!