zoukankan      html  css  js  c++  java
  • leetcode——Best Time to Buy and Sell Stock III

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

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

    image

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

    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;
            
        }
    };
  • 相关阅读:
    core dump的使用
    wav文件格式
    Unicode编码 【转】
    WAV格式中常见的压缩编码
    两台交换机级联端口mac地址表维护(转载)
    pthread_cond_wait()的使用方法
    makefile自动依赖[转]
    11月的第一天
    再读simpledb 之 事务管理的实现(3)
    再读simpledb 之 元数据管理(1)
  • 原文地址:https://www.cnblogs.com/skysand/p/4237590.html
Copyright © 2011-2022 走看看