题目:

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

链接: http://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/

题解:

一上来就没有头绪,查了一些资料以后发现大家都是用dp,可是怎么用dp才能又简洁又漂亮。不少朋友都是用类似Best Time to Buy and Sell Stock I的方法,正序来一次,逆序再来一次,然后求解,这样可以解决只能卖2次的情况。这个方法也跟Trap Rain Water很像。

Time Complexity - O(n), Space Complexity - O(n)。

public class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length < 2)
return 0;
int len = prices.length;
int localMin = prices[0];
int[] maxProfit = new int[len]; for(int i = 1; i < len; i++) {
maxProfit[i] = Math.max(maxProfit[i - 1], prices[i] - localMin);
localMin = Math.min(localMin, prices[i]);
} int localMax = prices[len - 1];
int res = 0; for(int i = len - 2; i >= 0; i--) {
localMax = Math.max(localMax, prices[i]);
res = Math.max(res, localMax - prices[i] + maxProfit[i]);
} return res;
}
}

还有更好的方法,我们可以用几个变量来代替辅助数组。 - 见discussion区weijiac。

Time Complexity - O(n), Space Complexity - O(1)。

之后还有Best Time to Buy and Sell Stock IV, 看了discussion里面有一篇weijiac的很好很受启发。他说自己是从"Single Number II"里想到一些类似的思路。我想可不可以像climb stairs一样,从只能走1,2步推广到只能走1,2,3步,至k步, 来思考下道题目。 还要好好想一想。试了一下用weijiac的方法在 IV里会超时,需要特殊处理,再继续研究吧。

二刷:

这道题也是EPI里array一章里面的题目。我们主要使用dp来解。

题目给出我们有两次买卖机会。假设第一次发生在[0, j]区间内,那么第二次一定发生在[j + 1, len - 1]区间里。所以由此原理,我们可以使用类似Best Time to Buy and Sell Stock I的方法,做两次dp。一次是从前向后,利用当前price - minPrice。第二次是从后向前,利用当前的maxPrice - price。这样下来,我们综合两次的结果就能找到最大profit。写的时候注意边界条件,多练习。

Java:

public class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length < 2) return 0;
int len = prices.length;
int[] oneTransProfit = new int[len];
int profit = 0, minPrice = Integer.MAX_VALUE;
for (int i = 0; i < len; i++) {
profit = Math.max(profit, prices[i] - minPrice);
oneTransProfit[i] = profit;
minPrice = Math.min(minPrice, prices[i]);
} profit = 0;
int maxPrice = 0;
for (int i = len - 1; i >= 0; i--) {
int secondTransProfit = (maxPrice - prices[i] > 0) ? (maxPrice - prices[i]) : 0;
profit = Math.max(profit, oneTransProfit[i] + secondTransProfit);
maxPrice = Math.max(maxPrice, prices[i]);
}
return profit;
}
}

Reference:

https://leetcode.com/discuss/25627/dp-o-kn-time-o-n-space-cpp-solution

https://leetcode.com/discuss/18159/sharing-my-simple-and-clear-c-solution

https://leetcode.com/discuss/48151/my-c-solution-o-n-time-o-1-space-8ms

https://leetcode.com/discuss/18330/is-it-best-solution-with-o-n-o-1

http://blog.csdn.net/linhuanmars/article/details/23236995

http://blog.csdn.net/fightforyourdream/article/details/14503469

http://www.programcreek.com/2014/02/leetcode-best-time-to-buy-and-sell-stock-iii-java/

https://leetcode.com/discuss/38150/simple-dp-8ms-solution-for-best-time-to-buy-and-sell-stock-iii

https://leetcode.com/discuss/21098/java-solution-with-just-two-traverses

https://leetcode.com/discuss/24330/a-clear-concise-dp-solution

https://leetcode.com/discuss/31271/a-clear-o-n-time-and-space-java-solution

https://leetcode.com/discuss/10427/share-my-simple-o-n-time-solution

https://leetcode.com/discuss/14806/solution-sharing-commented-code-o-n-time-and-o-n-space

https://leetcode.com/discuss/15290/a-o-n-time-and-o-1-space-greedy-algorithm

https://leetcode.com/discuss/1381/any-solutions-better-than-o-n-2

https://leetcode.com/discuss/2619/dont-need-dp-to-solve-it-within-o-n

http://www.cnblogs.com/springfor/p/3877068.html

http://www.programcreek.com/2014/03/leetcode-best-time-to-buy-and-sell-stock-iv-java/

https://leetcode.com/discuss/25603/a-concise-dp-solution-in-java

https://leetcode.com/discuss/15153/a-clean-dp-solution-which-generalizes-to-k-transactions

123. Best Time to Buy and Sell Stock III的更多相关文章

  1. LN : leetcode 123 Best Time to Buy and Sell Stock III

    lc 123 Best Time to Buy and Sell Stock III 123 Best Time to Buy and Sell Stock III Say you have an a ...

  2. LeerCode 123 Best Time to Buy and Sell Stock III之O(n)解法

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

  3. 【leetcode】123. Best Time to Buy and Sell Stock III

    @requires_authorization @author johnsondu @create_time 2015.7.22 19:04 @url [Best Time to Buy and Se ...

  4. [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 al ...

  5. 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III

    Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...

  6. LeetCode OJ 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 al ...

  7. 123. Best Time to Buy and Sell Stock III ——LeetCode

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

  8. [LeetCode] 123. Best Time to Buy and Sell Stock III 买卖股票的最佳时间 III

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

  9. 123. Best Time to Buy and Sell Stock III (Array; DP)

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

随机推荐

  1. 长度有限制的字符串hash函数

    长度有限制的字符串hash函数 DJBHash是一种非常流行的算法,俗称"Times33"算法.Times33的算法很简单,就是不断的乘33,原型如下 hash(i) = hash ...

  2. 如何禁止KnockoutJs在VS2012的智能格式化

    http://blogs.msdn.com/b/webdev/archive/2013/03/04/disabling-knockout-intellisense.aspx 我升级了一下VS2012, ...

  3. Linux 通过 shell 脚本修改密码

    交互方式修改密码 1. ssh 远程到主机: 2. 切换到root账号: [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]: 3. pas ...

  4. [CSS]下拉菜单

    原理:先让下拉菜单隐藏,鼠标移到的时候在显示出来 1>display 无动画效果,图片是秒出 2>opacity 有动画效果,我这里是1S出现,推荐配合绝对定位使用

  5. JavaScript笔记(二)——常用数组、字符串方法的应用

    1.将字符串中的字符翻转,比如'hello',翻转成'olleh'. var arr=[]; function reverseString(str) { arr=str.split("&qu ...

  6. Python 基础篇:介绍

    1. Python 发展 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Cir ...

  7. DHT网络第一部分研究结果 加入长期在线的node

    源码:http://jijiea.com/upfile/DHT_Part1_How_To_Join_In_DHT.zip

  8. ISBN

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  9. EXTJS 4.2 资料 控件之Window窗体自动填充页面

    1.html页面代码: <div id="component" style="width:100%;height:100%"> <body&g ...

  10. Xcode免证书打包ipa

    1,创建证书 打开“钥匙串访问”创建证书 填写好内容后点击继续,之后的步骤什么都不用改,一路点击“确定”和“继续”,最后完成这个向导就可以了. 我们创建的证书是不被信任的,右键点击证书选择“显示简介” ...