题目描述:
风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100
输入例子:
3,8,5,1,7,8
输出例子:
12
思路:
题目要求计算两次交易机会所获收益最大值,则可以先正序遍历一遍记录第k天时第一次交易可以获得的最大收益,然后再后序遍历一次,记录第k天时后面有第二次交易可获的最大收益。再将第k天的两次交易最大值相加比较即可获得结果。注意,正序遍历时表示在第k天之前可以获得的最大收益,后序遍历表示第k天后面可以获得的最大收益。
代码:
class Solution {
public:
/**
* 计算你能获得的最大收益
*
* @param prices Prices[i]即第i天的股价
* @return 整型
*/
int calculateMax(vector<int> prices) {
int len = prices.size();
vector<int> leftmax(n);
vector<int> rightmax(n);
//正序遍历
int primin = prices[0];
leftmax[0] = 0;
for(int i=1;i<len;++i){
primin = min(primin, prices[i]);
leftmax[i] = max(leftmax[i-1], prices[i] - primin);
}
//后序遍历
int primax = prices[len-1];
rightmax[len-1] = 0;
for(int i=len-2;i>=0;--i){
primax = max(primax, prices[i]);
rightmax[i] = max(rightmax[i+1], primax - prices[i]);
}
int pmax = 0;
for(int i=0;i<len;++i)
pmax = max(pmax, leftmax[i] + rightmax[i]);
return pmax;
}
};