【Best Time to Buy and Sell Stock III 】cpp
题目:
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).
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.empty()) return ;
const int len = prices.size();
vector<int> l(len,),r(len,);
// from left to right
l[] = ;
int l_min = prices[];
for ( int i = ; i < l.size(); ++i )
{
l_min = std::min(l_min, prices[i]);
l[i] = std::max(l[i-], prices[i]-l_min);
}
// from right to left
r[len-] = ;
int r_max = prices[len-];
for ( int i = len-; i >= ; --i )
{
r_max = std::max(r_max, prices[i]);
r[i] = std::max(r[i-], r_max-prices[i]);
}
// travseral the best two times
int max_profit = ;
for ( int i = ; i < prices.size(); ++i )
{
max_profit = std::max(max_profit, l[i]+r[i]);
}
return max_profit;
}
};
tips:
此题说最多交易两次,求最大获利。
直觉的想法就是,把整个时间段分割成两部分( 共有prices.size()种分类方法 );分好后分别求两部分各自的最大值;这种算法是O(n²)时间复杂度的。
模仿之前求过的largest rectangle in histogram这道题的思路,能否利用dp思想,把算过的中间结果都存起来,把时间复杂度降低到O(n)。
想到这个思路就比较明确了:
1. 从左向右走一遍,l[i]存放0~i最多交易1次获利最大的值
2. 从右向左走一遍,r[i]存放i~prices.size()-1最多交易一次获利的最大值
3. 遍历数组l和数组r,通过遍历每种分割情况下的最大获利,并最终获得最终的最大获利值。
这里还有个细节可能会产生疑义:如果以第i天作为分割点,那么这第i天是算到前半截还是后半截呢?
这里分两种情况:
1. 如果“前半截的最大利润”和“后半截的最大利润”只有一截涉及到了第i天,显然l[i]+r[i]这个算法是没问题的
2. 如果“前”、“后”两截都涉及到了第i天呢?这时候有两种理解方法:
2.1 前后交易两次:前半截的某一天买入,第i天卖了,挣一笔;第i天卖完又买入了,到后面的某一天又卖了,挣第二笔。两笔加起来最大。
2.2 前后交易一次:前半截的某一天买入,第i天虽然卖了获利最大,但是不卖,留着;等到后面的某一天发现获利最大,直接挣一笔最大的,同样获利最大。
因此,无论按照哪种理解方法,l[i]+r[i]都是合理的,不会因为第i天作为分割点而产生影响。
=====================================================
第二次过这道题,思路上有个地方没有理清(红字),在当天可以选择交易或者不交易,如果不交易那么等于左边(或右边)相邻元素的值。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if ( prices.empty() ) return ;
vector<int> l(prices.size(), );
vector<int> r(prices.size(), );
// l
int minPrices = prices[];
for ( int i=; i<prices.size(); ++i )
{
minPrices = min(prices[i], minPrices);
l[i] = max(l[i-1], prices[i]-minPrices);
}
// r
int maxPrices = prices[prices.size()-];
for ( int i=prices.size()-; i>=; --i )
{
maxPrices = max(maxPrices, prices[i]);
r[i] = max(r[i+1], maxPrices - prices[i]);
}
// l to r
int ret = ;
for ( int i=; i<prices.size(); ++i )
{
ret = max(ret, l[i]+r[i]);
}
return ret;
}
};
【Best Time to Buy and Sell Stock III 】cpp的更多相关文章
- 【Best Time to Buy and Sell Stock II】cpp
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- leetcode 【 Best Time to Buy and Sell Stock III 】python 实现
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- 【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】
[121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Say you have ...
- 【leetcode】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 ...
- 【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 ...
- 【刷题-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 ...
- 27. Best Time to Buy and Sell Stock && Best Time to Buy and Sell Stock II && Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock (onlineJudge: https://oj.leetcode.com/problems/best-time-to-buy-and- ...
- LeetCode 笔记23 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 ...
随机推荐
- (转载)C#中的lock关键字
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行,线程B稍微慢一点.线程A执 ...
- 域名与IP地址的联系与区别
我们也知道每一台机都有一个唯一ip地址, 特别难记,所以出现了今天的DNS(域名) 当我们的计算机想要和一个远程机器连接时,我们可以申请连接该机器ip地址下的DNS,例如:www.baidu.com. ...
- CSS变量(CSS variable)
使用 CSS 变量编写你的样式代码 基本使用: 1. --variable: <declaration-value> 2. <css-attribute>: var(--var ...
- sublime完美编码主题
Theme – Soda 使用Ctrl+Shift+P快捷键或者进入菜单:Preferences(首选项) - Package Control(插件控制),调出命令输入框,输入Install Pack ...
- springMvc-框架搭建
搭建springmvc框架的步骤: 1.在web.xml中配置springMvc的servlet 2.创建controller处理页面传来的数据, 3.床架springMvc文件,处理视图: 3.1: ...
- 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测
线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...
- python实现链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点 第一种实现: # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # ...
- mysql添加、移除服务
sc delete 服务名 路径/bin/mysqld --install 服务名
- html +css 登陆框中加用户图片,并设置登陆名不盖住图标
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python基础-Python注释
一.什么是注释.特性 1.一段文字性的描述,通过注释,可以解释和明确Python代码的功能,并记录将来要修改的地方. 2.当程序处理时,Python解释器会自动忽略,不会被当做代码进行处理 二.注释的 ...