123. Best Time to Buy and Sell Stock III

1人阅读 评论(0) 收藏 举报
分类:

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).

这道是买股票的最佳时间系列问题中最难最复杂的一道,前面两道Best Time to Buy and Sell Stock 买卖股票的最佳时间Best Time to Buy and Sell Stock II 买股票的最佳时间之二的思路都非常的简洁明了,算法也很简单。而这道是要求最多交易两次,找到最大利润,还是需要用动态规划Dynamic Programming来解,而这里我们需要两个递推公式来分别更新两个变量local和global,参见网友Code Ganker的博客,我们其实可以求至少k次交易的最大利润,找到通解后可以设定 k = 2,即为本题的解答。我们定义local[i][j]为在到达第i天时最多可进行j次交易并且最后一次交易在最后一天卖出的最大利润,此为局部最优。然后我们定义global[i][j]为在到达第i天时最多可进行j次交易的最大利润,此为全局最优。它们的递推式为:

local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)

global[i][j] = max(local[i][j], global[i - 1][j])

其中局部最优值是比较前一天并少交易一次的全局最优加上大于0的差值,和前一天的局部最优加上差值中取较大值,而全局最优比较局部最优和前一天的全局最优。代码如下:


class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty()) return 0;
        int n = prices.size(), g[n][3] = {0}, l[n][3] = {0};
        for(int i=1; i<prices.size(); ++i){
            int diff = prices[i] - prices[i-1];
            for(int j=1; j<=2; ++j)
            {
                l[i][j] = max(g[i-1][j-1]+max(diff,0), l[i-1][j]+diff);
                g[i][j] = max(l[i][j], g[i-1][j]);
            }
        }
        return g[n-1][2];
    }
};

查看评论

汇编语言程序设计III

汇编语言是一门低级程序设计语言,在数以千计的计算机语言中,有着不可替代的重要地位,广泛地用于开发操作系统内核、设备驱动程序等。随着近年来物联网、嵌入式系统的发展,汇编语言在行业中的地位也再次攀升,在2017年1月的TIOBE排行榜上,再次进入前十。对大多数学习计算机的人士而言,是理解计算机系统核心知识的一个桥梁,在人才培养中也起着特殊的作用。课程面向计算机初学者,介绍汇编语言程序设计最基础的部分。
  • 2017年03月08日 20:16

Leetcode 123 Best Time to Buy and Sell Stock III 至多两次买卖股票最大收益

假设你有一个数组,里面记录的是每一天的股票的价格。 设计一个算法来计算最大收益。你至多可以完成两次交易...
  • smile_watermelon
  • smile_watermelon
  • 2015-07-08 23:23:09
  • 3464

Best Time to Buy and Sell Stock III -- LeetCode

原题链接: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/  这道题是Best Time to Buy an...
  • linhuanmars
  • linhuanmars
  • 2014-04-09 05:34:05
  • 28312

【LeetCode】 Best Time to Buy and Sell Stock I II III IV 解题报告

Best Time to Buy and Sell Stock I题意:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易,也就是说只允许买一支股票并卖掉,求...
  • ljiabin
  • ljiabin
  • 2015-04-06 11:10:34
  • 22538

LeetCode123: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 a...
  • u012501459
  • u012501459
  • 2015-06-16 09:54:29
  • 1732

LeetCode(123) Best Time to Buy and Sell Stock III (Java)

题目如下: Say you have an array for which the ith element is the price of a given stock on day i. Desig...
  • feliciafay
  • feliciafay
  • 2015-04-19 13:20:26
  • 894

leetcode【121+122+123 best time to buy and sell stock】【python】

我们先拿出来前三道题,因为他们都是array中的题目。这是leetcode种经典的一系列题,涉及到动态规划和贪心算法。按照我的理解,贪心是满足当前条件的最优值我们就将它最为最优解,也就是大家说的局部最...
  • u014251967
  • u014251967
  • 2016-09-12 21:04:35
  • 1160

LeetCode--Best Time to Buy and Sell Stock III (动态规划)

LeetCode--Best Time to Buy and Sell Stock III (动态规划) 动态规划,最大m字段和
  • mason_mow
  • mason_mow
  • 2014-05-28 11:07:16
  • 1195

关于LeetCode中Best Time to Buy and Sell Stock一题的理解

题目如下: Say you have an array for which the ith element is the price of a given stock on day i. If yo...
  • zsy112371
  • zsy112371
  • 2016-09-09 13:55:36
  • 1354

【LeetCode】【Python题解】Best Time to Buy and Sell Stock II

Say you have an array for which the ith element is the price of a given stock on day i. Design an...
  • u011613729
  • u011613729
  • 2014-07-24 10:11:44
  • 3577
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 1404
    排名: 3万+
    博客专栏
    最新评论