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


才意识到能够在整个区间的每一点切开,然后分别计算左子区间和右子区间的最大值,然后再用O(n)时间找到整个区间的最大值。

看来以后碰到与2相关的问题,一定要想想能不能用二分法来做!
 
以下复制pickless的解说,我认为我不能比他讲的更好了
O(n^2)的算法非常easy想到:
找寻一个点j,将原来的price[0..n-1]切割为price[0..j]和price[j..n-1],分别求两段的最大profit。
进行优化:
对于点j+1,求price[0..j+1]的最大profit时,非常多工作是反复的,在求price[0..j]的最大profit中已经做过了。
类似于Best Time to Buy and Sell Stock,能够在O(1)的时间从price[0..j]推出price[0..j+1]的最大profit。
可是怎样从price[j..n-1]推出price[j+1..n-1]?反过来思考,我们能够用O(1)的时间由price[j+1..n-1]推出price[j..n-1]。
终于算法:
数组l[i]记录了price[0..i]的最大profit,
数组r[i]记录了price[i..n]的最大profit。
已知l[i],求l[i+1]是简单的,相同已知r[i],求r[i-1]也非常easy。
最后,我们再用O(n)的时间找出最大的l[i]+r[i],即为题目所求。

package Level4;  

import java.util.Arrays;  

/**
* 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).
*
*/
public class S123 { public static void main(String[] args) {
// int[] prices = {3,3,5,0,0,3,1,4};
int[] prices = {2,1,2,0,1};
System.out.println(maxProfit(prices));
} // 基本思想是分成两个时间段,然后对于某一天,计算之前的最大值和之后的最大值
public static int maxProfit(int[] prices) {
if(prices.length == 0){
return 0;
} int max = 0;
// dp数组保存左边和右边的利润最大值
int[] left = new int[prices.length]; // 计算[0,i]区间的最大值
int[] right = new int[prices.length]; // 计算[i,len-1]区间的最大值 process(prices, left, right); // O(n)找到最大值
for(int i=0; i<prices.length; i++){
max = Math.max(max, left[i]+right[i]);
} return max;
} public static void process(int[] prices, int[] left, int[] right){
left[0] = 0;
int min = prices[0]; // 左边递推公式
for(int i=1; i<left.length; i++){
left[i] = left[i - 1] > prices[i] - min ? left[i - 1] : prices[i] - min;
min = prices[i] < min ? prices[i] : min;
} right[right.length-1] = 0;
int max = prices[right.length-1];
// 右边递推公式
for(int i=right.length-2; i>=0; i--){
right[i] = right[i + 1] > max - prices[i] ? right[i + 1] : max - prices[i];
max = prices[i] > max ? prices[i] : max;
} // System.out.println(Arrays.toString(left));
// System.out.println(Arrays.toString(right));
} }

LeerCode 123 Best Time to Buy and Sell Stock III之O(n)解法的更多相关文章

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

  3. [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 ...

  4. 【刷题-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 ...

  5. 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 a ...

  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. codeforces 604B More Cowbell

    题目链接:http://codeforces.com/contest/604/problem/B 题意:n个数字,k个盒子,把n个数放入k个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少 ...

  2. Storm集群中执行的各种组件及其并行

    一.Storm中执行的组件      我们知道,Storm的强大之处就是能够非常easy地在集群中横向拓展它的计算能力,它会把整个运算过程切割成多个独立的tasks在集群中进行并行计算.在Storm中 ...

  3. 应届GIS硕士求职经验总结

    记录一下作为一个GIS应届毕业生在帝都找工作的历程吧,之后的经历可能丰富多彩,可能萎靡不振,但这一次走过来了就是这一次的.希望以史为鉴,各位客官也能有所收获. 定位 我们这一届的"烟酒生&q ...

  4. 算法起步之Prim算法

    原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...

  5. Java使用Socket传输文件遇到的问题(转)

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  6. linux find命令强大之处

    find命令 find pathname -options [-print -exec -ok ...]   -print: find命令将匹配的文件输出到标准输出.   -exec: find命令对 ...

  7. [Java聊天室server]实战之五 读写循环(服务端)

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  8. [LeetCode] Search for a Range [34]

    题目 Given a sorted array of integers, find the starting and ending position of a given target value. ...

  9. SWT中的Tree中 添加右键弹出菜单

    先看一下效果: 如图:在树上单击鼠标右键会弹出 弹出式菜单.做法其实很简单,先做一个树: final TreeViewer treeViewer = new TreeViewer(group, SWT ...

  10. HEVC码率控制浅析——HM代码阅读之二

    上一篇文章主要讨论了RC的总体框架,本文开始分析具体的代码实现细节.分析的顺序按照总体框架来,即初始化-->更新. (1)m_cRateCtrl.init() #if M0036_RC_IMPR ...