博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Best Time to Buy and Sell Stock III 买股票的最佳时间之三
阅读量:6207 次
发布时间:2019-06-21

本文共 1926 字,大约阅读时间需要 6 分钟。

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

这道是买股票的最佳时间系列问题中最难最复杂的一道,前面两道和的思路都非常的简洁明了,算法也很简单。而这道是要求最多交易两次,找到最大利润,还是需要用动态规划Dynamic Programming来解,而这里我们需要两个递推公式来分别更新两个变量local和global,参见网友,我们其实可以求至少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
&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]; }};

下面这种解法用一维数组来代替二维数组,可以极大的节省了空间,由于覆盖的顺序关系,我们需要j从2到1,这样可以取到正确的g[j-1]值,而非已经被覆盖过的值,参见代码如下:

解法二:

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

 本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
http协议内容
查看>>
C#语法——await与async的正确打开方式
查看>>
第38天:运算符、字符串对象常用方法
查看>>
换了电脑如何使用hexo继续写博客
查看>>
代码审计之DocCms漏洞分析
查看>>
深入框架本源系列 —— Virtual Dom
查看>>
北大CIO走进龙泉寺交流研讨会圆满举行
查看>>
Android View滚动、拉伸到顶/底部弹性回弹复位
查看>>
mongodb分布式集群搭建手记
查看>>
您有一个上云锦囊尚未领取!
查看>>
libcurl上传文件
查看>>
Java Web的web.xml文件作用及基本配置(转)
查看>>
PHP CURL 多线程 GET/POST 类
查看>>
关于双黑洞和引力波,LIGO科学家回答了这7个你可能会关心的问题
查看>>
“机器换人”之潮涌向珠三角,蓝领工人将何去何从
查看>>
阿里与珠海横琴新区达成战略合作,阿里云助力打造横琴智能岛
查看>>
CVE-2018-1000136:Electron nodeIntegration绕过漏洞
查看>>
订阅Jenkins的邮件列表,获取最新的信息
查看>>
PHP笔记——java程序员看懂PHP程序
查看>>
Facebook哭晕在厕所,调查显示用VR体验社交的用户仅为19%
查看>>