解题思路:
1 暴力法,用二重循环,计算出所有买卖股票可能的情况,最终得到结果。
时间复杂度O(n2),空间复杂度O(1)。
2 只用一次遍历
用max_profit来维护当前最大利润。
用min_price来维护下一次计算利润时的最小价格。
见代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max_profit=0;//记录当前最大利润
int min_price=INT_MAX;//记录当前最小价格
for(auto price:prices){
//先算一下这个时候卖出股票,能获得的最大利润
int curr_max_profit=price-min_price;
//看看是否有需要更新最高利润
max_profit=max(curr_max_profit,max_profit);
//计算完之后,看看是否有需要更新最低价格
min_price=min(price,min_price);
}
return max_profit;
}
};
思路一:
贪心算法只能用于计算最大利润,计算的过程不是实际交易的过程。
比如[1,2,3,4,5],第一天买,但是按题意我们不能在第二天先卖了再买,也就是在一天内同时进行买和卖的操作。
假如第二天的价格比第一天高,我就把这笔利润加上。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max_profit=0;
for(int i=1;i<prices.size();++i){
if(prices[i]>prices[i-1])
max_profit+=prices[i]-prices[i-1];
}
return max_profit;
}
};
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
//代表了四种情况的利润情况
int buy1=-prices[0],sell1=0;
int buy2=-prices[0],sell2=0;
for(int i=1;i<prices.size();++i){
//第一次买股票
buy1=max(buy1,-prices[i]);
//第一次买股票花的钱+这天卖出赚的钱
sell1=max(sell1,prices[i]+buy1);
//上一次买卖的利润-今天买股票花的钱
buy2=max(buy2,sell1-prices[i]);
//两次买卖获得的总利润
sell2=max(sell2,buy2+prices[i]);
}
return sell2;
}
};
股票可以买卖k次的做法