zoukankan      html  css  js  c++  java
  • [Leetcode]123.买卖股票的最佳时机3

    [原题链接][https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/]

    分析:动态规划+二分法。以第i天为分界线,计算第i天之前进行一次交易的最大收益left[i],和第i天之后进行一次交易的最大收益right[i],最后遍历一遍找到max{left[i] + right[i]} (0≤i≤n-1),就是最大收益。第i天之前和第i天之后进行一次的最大收益求法如最简单的股票买卖问题。

    再求解前先看看最简单的求一次交易的最大收益解法

    /*用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易,也就是说只允许买一支股票并卖掉,求最大的收益。
    
    题解:动态规划法。从前向后遍历数组,记录当前出现过的最低价格,作为买入价格,并计算以当天价格出售的收益,作为可能的最大收益,整个遍历过程中,出现过的最大收益就是所求。*/
    
    int maxProfit(const int prices[],const int len){
        if(len<2)
            return 0;
        int maxProfit = 0;
        int curMin = prices[0];
        /*发现只进行了一次遍历*/
        for (int i = 1; i < len;i++){
            curMin = min(curMin, prices[i]);
            maxProfit = max(maxProfit, prices[i] - curMin);
            /*每次遍历后的maxProfix就是 从prices[0]开始到prices[i]的最大收益*/
        }
        return maxProfit;
    }
    

    利用上述最简单情况的求一次交易的最大收益方法,顺序遍历一遍把每个阶段的maxProfit保留到left[i],逆序遍历一遍并把每个阶段的maxProfit保留到right[i]中。

    上面代码只进行了一次遍历,验证了下面代码的left[i]right[i]就是第i天前一次交易最大收益第i天后一次交易最大收益

    时间复杂度:O(n)

    class Solution {
    public:
       int maxProfit(vector<int> &prices)
    {
        int s = prices.size();
        if (s < 2)
            return 0;
        int preMaxvalue[s], postMaxvalue[s];
        memset(preMaxvalue, 0, sizeof(preMaxvalue));
        memset(postMaxvalue, 0, sizeof(postMaxvalue));
    
        int curMin = prices[0];
        for (int i = 1; i < s; i++)
        {
            curMin = min(curMin, prices[i]);
            preMaxvalue[i] = max(preMaxvalue[i - 1], prices[i] - curMin);
        }
    
        int curMax = prices[s - 1];
        for (int i = s - 2; i >= 0; i--)
        {
            curMax = max(curMax, prices[i]);
            postMaxvalue[i] = max(postMaxvalue[i + 1], curMax - prices[i]);
        }
    
        int maxProfit = 0;
        for (int i = 0; i < s; i++)
        {
            maxProfit = max(maxProfit, preMaxvalue[i] + postMaxvalue[i]);
        }
        return maxProfit;
    }
    };
    
  • 相关阅读:
    WinowsXP 任务栏无法显示当前运行程序图标
    日志记录组件[Log4net]详细介绍(转)
    桌面上的IE图标变成了快捷方式那种图标 怎么还原回来
    面试必须要知道的SQL语法,语句(转载)
    兼容 火狐 IE 的JS时间控件 任意格式 年月日时分秒
    Nagios远程监控软件的安装与配置详解(1)
    linux集群 负载均衡实验笔记
    PHPB2B 模板 标签
    PHP 去除 HTML 回车 换行 空格
    OpenX参考网址
  • 原文地址:https://www.cnblogs.com/adamwong/p/10201165.html
Copyright © 2011-2022 走看看