zoukankan      html  css  js  c++  java
  • LeetCode(123) Best Time to Buy and Sell Stock III

    题目

    Say you have an array for which the ith element is the price of a given stock on day i.

    Design an algorithm to find the maximum profit. You may complete at most two transactions.

    Note:
    You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

    Subscribe to see which companies asked this question

    分析

    紧接着121 122 的另外一道题目,此次要求只能进行两次买卖交易,求最大利润。

    一篇很好的分析文章,参考博客

    第一步扫描,先计算出子序列[0,…,i]中的最大利润,用一个数组保存下来,那么时间是O(n)。
    计算方法也是利用第一个问题的计算方法。

    第二步是逆向扫描,计算子序列[i,…,n-1]上的最大利润,这一步同时就能结合上一步的结果计算最终的最大利润了,这一步也是O(n)。

    第三步,求[0,i]的最大利润与[i,n-1]的最大利润之和的最大值,所以最后算法的复杂度就是O(n)的。

    AC代码

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            if (prices.empty())
                return 0;
    
            int n = prices.size();
    
            vector<int> profits(n, 0), profits_reverse(n,0);
    
            //正向遍历,profits[i]表示 prices[0...i]内做一次交易的最大收益.
            int low = prices[0] , cur_profit = 0;
            for (int i = 1; i < n; ++i)
            {
                if (prices[i] < low)
                {
                    low = prices[i];
                }
                else{
                    if (cur_profit < prices[i] - low)
                        cur_profit = prices[i] - low;
                }
                profits[i] = cur_profit;
            }//for
    
            //逆向遍历, profits_reverse[i]表示 prices[i...n-1]内做一次交易的最大收益.
            //当前最大价格
            int high = prices[n - 1];
            cur_profit = 0;
            for (int i = n - 2; i >= 0; --i)
            {
                if (prices[i] > high)
                    high = prices[i];
                else{
                    if (cur_profit < high - prices[i])
                        cur_profit = high - prices[i];
                }//else
                profits_reverse[i] = cur_profit;
            }
    
            int max_profile = 0;
            for (int i = 0; i < n; i++)
            {
                if ((profits[i] + profits_reverse[i]) > max_profile)
                    max_profile = profits[i] + profits_reverse[i];
            }
            return max_profile;
        }
    };

    GitHub测试程序源码

  • 相关阅读:
    APP与智能手表是如何通信的【本文摘抄自深圳尚锐科技】
    flash添加超链接的办法
    NPOI使用手册
    如何在 SQL Server 实例之间传输登录和密码
    CentOS 7 上部署Mono 4 和Jexus 5.6
    django models 中choices之用法举例
    django中的objects.get和objects.filter方法的区别
    Django中的Model.objects.create() 和 Model() 的区别?
    python爬虫练手项目快递单号查询
    根据现有的数据库自动生成Django model
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214782.html
Copyright © 2011-2022 走看看