题目:

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. UVALive 2889(回文数字)

    题意:给定i,输出第i个回文数字. 分析:1,2,3,4,……,9------------------------------------------------------------------- ...

  2. root-systerm-bin是什么program

    root-systerm-bin是什么program http://packages.ubuntu.com/lucid/root-system-bin

  3. C++中执行windows指令

    执行windows指令: BOOL ExecDosCmd(]) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(S ...

  4. vi 技巧

    :%s/^/\//   行首加 / :%s/$/\//    行尾加/ :%s/^\///g   行首减 / :%s/\/$//g   行尾减/ :%s/^\s*//g  行首减 空格   

  5. DataGridView显示时间格式

    默认显示时间不显示秒yyyy-MM-dd HH:mm dataGridView.Columns["日期时间字段"].DefaultCellStyle.Format = " ...

  6. 关于html5 -- plus Webview模块管理应用窗口界面

    Webview模块管理应用窗口界面,通过plus.webview可获取应用界面管理对象. 方法: all:获取所有的webview窗口 close:关闭webview窗口 create:创建新的web ...

  7. console.log的使用

    相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是console能看到对象的内容. console不会打断你页面的操作,如果用al ...

  8. Mysql 备份恢复之 Mysqldump 工具

    目前正在学习中,看到mysqldump工具导出的数据都是文本形式的,如果是blob或text大对象类型导出的是什么格式的?这个需要后续研究.下面只先总结下简单的. 一.备份1.备份Mysql一个数据库 ...

  9. php生成xml的四种方法(转)

    <?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...

  10. iOS 基础 第三天(0808)

    0808 分类的使用注意 分类只可以增加方法,不可以增加成员变量 分类可以访问原来类中声明的成员变量 分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用 方法调用的优先 ...