[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 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
随机推荐
- IBM X3650 M3/M4的服务器装系统
IBM X3650 M3/M4的服务器一般都有两块以上的硬盘.所以如果没有做RAID,那首先应该做好raid 磁盘阵列.本文装系统的前提是RAID已经做好. 一般安装系统的方式为先在IBM官网下载对应 ...
- C的指针和数组
int i; //定义整型变量i int *p; //定义一个指向int的指针变量p int a[5]; //定义一个int数组a int *p[5]; //定义一个指针数组,其中每个数组元素指向一个 ...
- Spring Boot 入门实践
一.Eclipse配置Spring Boot环境 1.查看eclipse版本信息: 2.登录:http://spring.io/tools/sts/all 看eclipse对应的插件版本对应的ecli ...
- IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理 (一)
邮件发送功能总结 第一部分 背景 一.使用场景 (1)注册验证 注册各大网站,通常需要输入邮件地址,在注册成功后,会发送一封邮箱验证的邮件,点击确认,证明这个邮箱是用户自己的 ...
- mmm和mmma的区别
m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...
- Mathtype批量修改公式
(1)将模板中的公式直接打开 (2)将需要修改好的公式复制黏贴到模板中 (3)再复制黏贴出,即可 PS: (1)统一设置公式格式 (2)统一设置公式大小
- 主机网络ping: unknown host baidu.com问题解决
本机环境: 系统:Centos 网络:NAT 虚拟机之前一直都可以连外网,但最近不能连了,现状如下: [root@vhost03 ~]# ping baidu.comping: unknown hos ...
- MySQL导入导出表数据
原文链接:http://blog.163.com/yang_jianli/blog/static/1619900062010111011041228/ 1.这里的导出和mysqldump不同,只是导出 ...
- 安装BouncyCastle
对于Windows而言 将bcprov-jdk16-146.jar 复制到C:\Program Files\Java\jre6\lib\ext和C:\jdk1.6.0\jre\lib\ext目录下: ...
- git使用教程(初次配置+错误提示)
初次使用配置目录:https://blog.csdn.net/Esc_Tab_End/article/details/84144063 error: RPC failed; curl 56 OpenS ...