lintcode:买卖股票的最佳时机 III
买卖股票的最佳时机 III
假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。
样例
给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6
解题
尝试参考买卖股票的最佳时机 II 提交运行发现错误,每次找到连续的递增子数组记录前后的差值,找到两个最大的。如下程序,其实有问题,最大的差值,可能跨两个子数组的。
如:{1,2,4,2,5,7,2,4,9,0}
三个递增数组:{1,2,4}、{2,5,7}、{2,4,9},起始数组的差是:3、5、7,最大两个和是;5+7= 12
然后对前两数组,第二个数组的起始数大于第一个的起始数,而第二个的结束数大于第一个的结束数,通过递增子数组还大于2个,所有有个更大的其实数组差是:7-1 = 6.
public int maxProfit(int[] A) {
// write your code here
if(A == null || A.length == 0)
return 0;
if(A.length == 1)
return 0;
int sum=0;
int i = 0;
int j = 0;
int subSum1 = Integer.MIN_VALUE;
int subSum2 = Integer.MIN_VALUE;
int tmpSum = 0;
while(i < A.length && j < A.length){
tmpSum = 0;
while(j<A.length-1 && A[j] <= A[j+1])
j++;
tmpSum += A[j] - A[i];
if(subSum1 > subSum2){ // subSum1 是较小者
int tmp = subSum1;
subSum1 = subSum2;
subSum2 = tmp;
}
// 当 tmpSum 比较小 subSum1 大 的时候更新sumSum1
if(tmpSum > subSum1){
subSum1 = tmpSum;
}
i = j + 1;// 下一个位置从新开始
j = j + 1;
}
if( subSum2 == Integer.MIN_VALUE)
return subSum1;
return subSum1 + subSum2;
}
题目标签中有个前后遍历,就想到定义两个数组
left[i] 表示0 - i 并且i是卖出的最大收益
right[i] 表示i - A.length-1 并且i 是买入的最大收益
最后求两个数组的最大和,但是这里时间复杂度是O(N^2)可以进一步的降低的
class Solution {
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] A) {
// write your code here
if(A == null || A.length == 0)
return 0;
if(A.length == 1)
return 0;
int sum=0;
int[] left = new int[A.length];
int[] right = new int[A.length];
int min = A[0];
// left[i] 表示在 0 - i 中能够 卖出的最大收益,当是 0的时候表示不买也不卖
for(int i =1;i< A.length;i++){
if(min<= A[i]){
left[i] = A[i] - min;
}else
min = A[i];
}
int max = A[A.length - 1];
// right[i] 表示在 i - A.length-1 中能够卖出的最大收益
for( int i = A.length -2;i>=0;i--){
if(max >= A[i]){
right[i] = max - A[i];
}else{
max = A[i];
}
}
max = Integer.MIN_VALUE;
for(int i = 0;i< A.length;i++){
for(int j = i;j<A.length;j++)
max = Math.max(max,left[i] + right[j]);
}
return max;
}
};
如果我们更改定义的两个数组
left[i] 表示0 - i 这段数组的最大收益
right[i] 表示i - A.length-1 这段数组的最大收益
在求两个数组的和时候只需要线性的时间复杂度
class Solution {
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] A) {
// write your code here
if(A == null || A.length == 0)
return 0;
if(A.length == 1)
return 0;
int sum=0;
int[] left = new int[A.length];
int[] right = new int[A.length];
int min = A[0];
// left[i] 表示在 0 - i 中能够 卖出的最大收益,当是 0的时候表示不买也不卖
for(int i =1;i< A.length;i++){
if(min<= A[i]){
left[i] = Math.max(left[i-1], A[i] - min);
}else{
left[i] = left[i-1];
min = A[i];
} }
int max = A[A.length - 1];
// right[i] 表示在 i - A.length-1 中能够卖出的最大收益
for( int i = A.length -2;i>=0;i--){
if(max >= A[i]){
right[i] = Math.max(right[i+1],max - A[i]);
}else{
right[i] = right[i+1];
max = A[i];
}
}
max = Integer.MIN_VALUE;
for(int i = 0;i< A.length;i++){
max = Math.max(max,left[i] + right[i]);
}
return max;
}
};
lintcode:买卖股票的最佳时机 III的更多相关文章
- lintcode:买卖股票的最佳时机 IV
买卖股票的最佳时机 IV 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格. 设计一个算法来找到最大的利润.你最多可以完成 k 笔交易. 注意事项 你不可以同时参与多笔交易(你必须在再次 ...
- Leetcode 123.买卖股票的最佳时机III
买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...
- Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...
- Java实现 LeetCode 123 买卖股票的最佳时机 III(三)
123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...
- lintcode:买卖股票的最佳时机 I
买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...
- lintcode:买卖股票的最佳时机 II
买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...
- 【LeetCode】123、买卖股票的最佳时机 III
Best Time to Buy and Sell Stock III 题目等级:Hard 题目描述: Say you have an array for which the ith element ...
- LeetCode(123):买卖股票的最佳时机 III
Hard! 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必 ...
- [Swift]LeetCode123. 买卖股票的最佳时机 III | 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 ...
随机推荐
- 解决sharepoint 2010 用户配置文件同步服务 正在启动
用户配置文件同步服务一直显示“正在启动”,而且无法停止,如下办法可以停止这个服务: 在sharepoint power shell 中执行下面的命令: Get-spserviceinstance 获取 ...
- verilog实现的16位CPU单周期设计
verilog实现的16位CPU单周期设计 这个工程完成了16位CPU的单周期设计,模块化设计,包含对于关键指令的仿真与设计,有包含必要的分析说明. 单周期CPU结构图 单周期CPU设计真值表与结构图 ...
- SQL SERVER发布与订阅 [原创]
一.配置分发 1.配置分发服务器,注:配置发布与订阅,连接SQLSERVER必须用服务器名登录 2.配置分发 3.选择分发服务器 4.选择快照文件夹 5.设置此文件夹的读写权限为everyone 6. ...
- Tomcat配置HTTPS方式生成安全证书
在Tomcat 6中配置SSL双向认证是相当容易的,本文将介绍如何使用JDK的keytool来为Tomcat配置双向SSL认证.并实现批量生成证书 系统需求:JDK 5.0Tomcat 6.0.16启 ...
- appium 调试问题--UiAutomator died while responding to command
运行程序问题: 解决办法: 手机系统版本较低导致,我是V4.2.2,在android 4.3 系统上运行正常 代码如下: #coding=utf-8 ''' 作者:xxx 功能:测试计算器基本功能 注 ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- 【BZOJ】【1030】【JSOI2007】文本生成器
AC自动机/DP Orz ZYF 玛雅快要省选了,赶紧复(xue)习(xi)一下AC自动机…… 其实在AC自动机上DP并没有当初想的那么复杂……就是把DP的转移关系换成了AC自动机上的边而已(不过这题 ...
- 【BZOJ】【1520】【POI2006】Szk-Schools
网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...
- Drawing with GoogLeNet
Drawing with GoogLeNet In my previous post, I showed how you can use deep neural networks to generat ...
- 使用Zend OpCache 提高 PHP 5.5+ 性能
使用Zend OpCache 提高 PHP 5.5+ 性能 作者:admin | 时间:February 28, 2015 | 分类:Linux | 评论:1 评论 PHP 5.5 以后内建了 OpC ...