买卖股票的最佳时机
题目:
- 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
- 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。
- 如果你不能获取任何利润,返回 0 。
思路:
动态规划去做
每一次的钱是和上一天有关系的,而上一天实际上只有两种可能性(要不持有要不就不持有),只需要在上一次的时候再迭代计算即可。如下面所讨论的:
- 今天持有
- 前一天没持有: 当前利润就是0
- 前一天持有: 当前利润就是今天股票的值 -昨天股票值+ 昨天的持有的利润值
- 今天不持有
- 前一天没持有: 当前利润就是前一天没持有的利润
- 前一天持有: 当前利润就是昨天持有的利润值
对以上两种情况下求取最大值即可推断出今天持有的还是非持有的最大利润是多少,不断进行计算。
编程思路:
可以保存昨天的两个值进行计算也可以建立一个数组会更清晰一些(数组的其中一列为持有 一列为非持有)
class Solution {
public:
int max(int x1, int x2){
if(x1 > x2) return x1;
else return x2;
}
int maxProfit(vector<int>& prices) {
if(prices.size() < 1) return 0;
if(prices.size() == 2){
if(prices[0] < prices[1]) return prices[1] - prices[0];
else return 0;
}
int chiyou_last = 0;
int buchiyou_last = 0;
int chiyou_now;
int buchiyou_now;
int max_lirun = 0;
int max_lirunxx = 0;
for(int i = 1; i < prices.size(); i++){
chiyou_now = max(0, prices[i] - prices[i-1] + chiyou_last);
buchiyou_now = max(buchiyou_last,chiyou_last);
//cout << chiyou_now << " "<<buchiyou_now<<endl;
max_lirunxx = max(chiyou_now,buchiyou_now);
max_lirun = max(max_lirun,max_lirunxx);
buchiyou_last = buchiyou_now;
chiyou_last = chiyou_now;
}
return max_lirun;
}
};