题目
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
思路
这道题看到了一个很有意思的解法。
首先每一天的能进行的操作无非就是买,卖,什么也不干这3种。
那么我们每一天可能有三种状态
buy(可以卖,也可以什么也不做,但不能买)
sell (只能什么也不做)
nothing(可以买,也可以什么也不做,但不能卖东西)
用三个变量分别记录下每一天这三种状态的最大金钱数。(preBuy,preSell,preNothing是上一天这三种状态的金钱数)
buy = max(preBuy , preNothing - prices[loop] );
sell = preBuy + prices[loop] ;
nothing = max(preNothing , preSell );
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0){
return 0;
}
int buy = -prices[0] , sell = 0 , nothing = 0;
for(int loop = 1 ; loop < prices.size() ; loop++){
int preBuy = buy;
int preSell = sell;
int preNothing = nothing;
buy = max(preBuy , preNothing - prices[loop] );
sell = preBuy + prices[loop] ;
nothing = max(preNothing , preSell );
//cout << buy << " " << sell << " " << nothing <<endl;
}
return max(nothing , sell);
}
};