[Leetcode]123.买卖股票的最佳时机3
[原题链接][https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/]
分析:动态规划+二分法。以第i天为分界线,计算第i天之前进行一次交易的最大收益left[i],和第i天之后进行一次交易的最大收益right[i],最后遍历一遍找到max{left[i] + right[i]} (0≤i≤n-1),就是最大收益。第i天之前和第i天之后进行一次的最大收益求法如最简单的股票买卖问题。
再求解前先看看最简单的求一次交易的最大收益解法
/*用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易,也就是说只允许买一支股票并卖掉,求最大的收益。
题解:动态规划法。从前向后遍历数组,记录当前出现过的最低价格,作为买入价格,并计算以当天价格出售的收益,作为可能的最大收益,整个遍历过程中,出现过的最大收益就是所求。*/
int maxProfit(const int prices[],const int len){
if(len<2)
return 0;
int maxProfit = 0;
int curMin = prices[0];
/*发现只进行了一次遍历*/
for (int i = 1; i < len;i++){
curMin = min(curMin, prices[i]);
maxProfit = max(maxProfit, prices[i] - curMin);
/*每次遍历后的maxProfix就是 从prices[0]开始到prices[i]的最大收益*/
}
return maxProfit;
}
利用上述最简单情况的求一次交易的最大收益方法,顺序遍历一遍把每个阶段的maxProfit保留到left[i],逆序遍历一遍并把每个阶段的maxProfit保留到right[i]中。
上面代码只进行了一次遍历,验证了下面代码的left[i]和right[i]就是第i天前一次交易最大收益和第i天后一次交易最大收益
时间复杂度:O(n)
class Solution {
public:
int maxProfit(vector<int> &prices)
{
int s = prices.size();
if (s < 2)
return 0;
int preMaxvalue[s], postMaxvalue[s];
memset(preMaxvalue, 0, sizeof(preMaxvalue));
memset(postMaxvalue, 0, sizeof(postMaxvalue));
int curMin = prices[0];
for (int i = 1; i < s; i++)
{
curMin = min(curMin, prices[i]);
preMaxvalue[i] = max(preMaxvalue[i - 1], prices[i] - curMin);
}
int curMax = prices[s - 1];
for (int i = s - 2; i >= 0; i--)
{
curMax = max(curMax, prices[i]);
postMaxvalue[i] = max(postMaxvalue[i + 1], curMax - prices[i]);
}
int maxProfit = 0;
for (int i = 0; i < s; i++)
{
maxProfit = max(maxProfit, preMaxvalue[i] + postMaxvalue[i]);
}
return maxProfit;
}
};
[Leetcode]123.买卖股票的最佳时机3的更多相关文章
- Java实现 LeetCode 123 买卖股票的最佳时机 III(三)
123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...
- Leetcode 123.买卖股票的最佳时机III
买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...
- leetcode 123. 买卖股票的最佳时机 III JAVA
题目: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买前出 ...
- leetcode 123. 买卖股票的最佳时机 III
使用动态规划的解法,空间复杂度O(2*2)如果交易k次则为O(2*k),时间复杂度O(2n),交易k次为O(n*k), 因此本题实际上可以退化为买卖一次的情况:去掉buy2和sell2,即leetco ...
- 每日一题-——LeetCode(121)买卖股票的最佳时机
题目描述: 给定一个数组,它的第 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 ...
- LeetCode《买卖股票的最佳时机》系列题目,最详解
目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...
- Leetcode——121. 买卖股票的最佳时机
题目描述:买卖股票的最佳时机 题目要求求解能获得最大利润的方式? 可以定一个二维数组 d [ len ] [ 2 ] ,其中d[ i ][ 0 ] 表示前i天可以获得的最大利润:d[ i ][ 1 ] ...
- Leetcode 188.买卖股票的最佳时机IV
买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
随机推荐
- 文字过多以省略号代替,放在文字上会显示title信息提示
第一种: <td style="text-align:left; word-wrap:break-word;" title="${b.remarks}"& ...
- Java利用MethodHandle实现反射时调用super的method
一:实现 1.Base类的实现 package me.silentdoer.reflecsuper; /** * @author silentdoer * @version 1.0 * @descri ...
- ubuntu 设置DNS
sudo vi /etc/resolv.conf #加入nameserver 114.114.114.114
- Bagging和Boosting的区别
转:http://www.cnblogs.com/liuwu265/p/4690486.html Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的 ...
- Jersey RESTful WebService框架学习(五)使用@BeanParam
第一步:定义一个实体类 注意:实体类的属性需要加上FormParam注解 public class User { @FormParam("name") private String ...
- VB网络编程中Winsock的使用
原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html 如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以 ...
- IP和网段及子网掩码基础知识
IP地址由网络号和主机号两部分组成,网络号的最高位必须是"0",IP地址和子网掩码求"与"算出网络地址,只有网络地址相同才可直接通信,否则需要借助路由. 主机标 ...
- 批处理FINDSTR正则表达式用法实例分析
1.findstr . 2.txt 或 Findstr "." 2.txt 从文件2.txt中查找任意字符,不包括空字符或空行 2.findstr .* 2.txt 或 finds ...
- 基于脚本的nodemanager管理器
Step 6: Configure Node Manager on the Managed Servers虚拟机环境: 管理服务器IP:192.168.227.10 AdminServer 受管服务 ...
- (转)ASP.NET MVC 4 RC的JS/CSS打包压缩功能
转自:http://www.cnblogs.com/shanyou/archive/2012/06/22/2558580.html 打包(Bundling)及压缩(Minification)指的是将多 ...