LeetCode: Best Time to Buy and Sell Stock III 解题报告
Best Time to Buy and Sell Stock III
Question Solution
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).
解答:
1. 从左往右扫描,计算0-i的这个区间的最大利润。方法可以参见股票第一题
2. 从右往左扫描,计算i-len这个区间的最大利润。方法同上。
3. 再从头至尾扫一次,每个节点加上左边和右边的利润。记录最大值。
复制一点别人的讲解:
O(n^2)的算法很容易想到:
找寻一个点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]也很容易。
最后,我们再用O(n)的时间找出最大的l[i]+r[i],即为题目所求。(最后一步可以合并在第二步中)。
REF: http://blog.csdn.net/pickless/article/details/12034365
代码1:
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
} int len = prices.length;
int[] left = new int[len];
int[] right = new int[len]; int min = prices[0];
left[0] = 0;
for (int i = 1; i < len; i++) {
min = Math.min(min, prices[i]);
left[i] = Math.max(left[i - 1], prices[i] - min);
} int max = prices[len - 1];
right[len - 1] = 0;
for (int i = len - 2; i >= 0; i--) {
max = Math.max(max, prices[i]);
right[i] = Math.max(right[i + 1], max - prices[i]);
} int rst = 0;
for (int i = 0; i < len; i++) {
rst = Math.max(rst, left[i] + right[i]);
} return rst;
}
代码2:
public class Solution {
public int maxProfit(int[] prices) {
if (prices == null) {
return 0;
} int ret = 0; int len = prices.length;
int[] leftProfile = new int[len];
int profile = 0; int min = Integer.MAX_VALUE;
for (int i = 0; i < len; i++) {
min = Math.min(min, prices[i]);
profile = Math.max(profile, prices[i] - min);
leftProfile[i] = profile;
} int max = Integer.MIN_VALUE;
profile = 0;
for (int i = len - 1; i >= 0; i--) {
max = Math.max(max, prices[i]);
profile = Math.max(profile, max - prices[i]); // sum the left profit and the right profit.
ret = Math.max(ret, profile + leftProfile[i]);
} return ret;
}
}
DP思路:
// DP solution:
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
} int ret = 0; int len = prices.length;
int[] leftProfile = new int[len]; int min = prices[0];
leftProfile[0] = 0;
for (int i = 1; i < len; i++) {
min = Math.min(min, prices[i]);
leftProfile[i] = Math.max(leftProfile[i - 1], prices[i] - min);
} int max = Integer.MIN_VALUE;
int profile = 0;
for (int i = len - 1; i >= 0; i--) {
max = Math.max(max, prices[i]);
profile = Math.max(profile, max - prices[i]); // sum the left profit and the right profit.
ret = Math.max(ret, profile + leftProfile[i]);
} return ret;
}
LeetCode: Best Time to Buy and Sell Stock III 解题报告的更多相关文章
- LeetCode: Best Time to Buy and Sell Stock II 解题报告
Best Time to Buy and Sell Stock IIQuestion SolutionSay you have an array for which the ith element i ...
- 【LeetCode】123. Best Time to Buy and Sell Stock III 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】188. Best Time to Buy and Sell Stock IV 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] 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 ...
- [LeetCode] Best Time to Buy and Sell Stock III
将Best Time to Buy and Sell Stock的如下思路用到此题目 思路1:第i天买入,能赚到的最大利润是多少呢?就是i + 1 ~ n天中最大的股价减去第i天的. 思路2:第i天买 ...
- LeetCode: Best Time to Buy and Sell Stock III [123]
[称号] Say you have an array for which the ith element is the price of a given stock on day i. Design ...
- [Leetcode] Best time to buy and sell stock iii 买卖股票的最佳时机
Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...
- Best Time to Buy and Sell Stock III 解题思路
题目要求: 最多交易两次,并且只能买卖完之后再买. 总思路: 在数组中找一个适当的点i,使得i左右两边profit之和最大. 思路: 1.从左往右扫描,left[i]记录包括i元素以内的左部的maxp ...
- [leetcode]Best Time to Buy and Sell Stock III @ Python
原题地址:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ 题意: Say you have an array ...
随机推荐
- 更改具有Foreign key约束的表
1.Foreign key 说明: foreign key(外键) 建立起了表与表之间的约束关系,让表与表之间的数据更具有完整性和关联性.设想,有两张表A.B,A表中保存了许多电脑制造商的信息,比如联 ...
- 002.Docker安装部署
一 docker安装-CentOS系统 1.1 docker自动安装脚本 root@docker:~# wget -qO- https://get.docker.com/ | sh 或—— root@ ...
- LVN与其在Linux上的实现
参考资料: LVM详解-骏马金龙-博客园 How to reduce the size of an LVM partition formatted with xfs filesystem on Cen ...
- react和vue的异同点
一.相似处1.使用Virtual DOM,都有jsx,性能好.2.提供了响应式(reactive)和可组合的视图组件(composable view component).3.将注意力集中保持在核心库 ...
- Winform给TextBox设置默认值
Winform给TextBox设置默认值(获取焦点后默认值消失) 主要是通过TextBox的获取焦点Enter和失去焦点Leave两个事件来实现的, 思路如下: 1.设置一个字符串常量,作为TextB ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- JavaScript_几种创建对象(2017-07-04)
理解对象 1.创建Object实例 var clock = new Object(); clock.hour = 12; clock.minute = 10; clock.showHour = fun ...
- git的安装以及入门
安装:https://blog.csdn.net/itpinpai/article/details/48105445 (1)下载文件 初始化 git init 连远程服务器 git remote ad ...
- php基本类型
php是一种弱类型语言,即变量不需要声明为特定的数据类型,因此在代码编写过程中做'类型处理'很重要. 处理方法: 1.检测类型: 2.转换类型: 3.依赖良好清晰的文档. php类型检查函数: ...
- Mongoose多数据库连接及实用样例
使用环境: MongoDB 3.6 插件版本: "mongodb": "^3.1.10","mongoose": "^5.4.2& ...