题目描述
【leetcode】122. 买卖股票的最佳时机 II( Best Time to Buy and Sell Stock II )
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
第一次解答
思路:
与股票问题1类似,只不过每一个波峰时就出售一次
把prices的散点图画出来,在每个极大值点卖出股票,股票买入价格取上一个极小值点
test case:
[2,1,2,0,1]
[7,1,5,3,6,4]
[1,2,3,4,5]
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0)
return 0;
int last_min_price = 0x7fffffff;
int max_profit = 0;
int max_local_profit = 0;
for(int i=0; i<prices.size(); ++i){
if(prices[i] < last_min_price){
last_min_price = prices[i];
}
else if(prices[i]-last_min_price >= max_local_profit){
max_local_profit = prices[i]-last_min_price;
//或左边不成立后才会判断右边,所以不担心i+1越界
if(i+1 >= prices.size() || prices[i+1] < prices[i]){
max_profit += max_local_profit;
max_local_profit = 0;
last_min_price = prices[i];
}
}
}
max_profit += max_local_profit;
return max_profit;
}
};
结果:
第二次解答
看了题解,解法一的方法不变,但可以改变思路来简化代码。
解法一是每到一个极大值就卖出,利润=极大值-上一个极小值。
我们可以简化思路,不一定非要等到极大值就卖出,而是每有利润就卖出(因为我们并不是真正的在炒股,没有买入步骤)。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0)
return 0;
int max_profit = 0;
for(int i=0; i<prices.size()-1; ++i){
if(prices[i+1] > prices[i]){
max_profit += prices[i+1] - prices[i];
}
}
return max_profit;
}
};
结果: