20191219更新:
之前的版本有问题:
// class Solution{
// public:
// int maxProfit(vector<int>& prices){
// size_t siz = prices.size();
// if(siz == 0 || siz == 1) return 0;
// vector<int> result(siz, 0);
// for(size_t i = 1; i < siz; i++){
// //r[i]>=0
// result[i] = max(result[i-1]+prices[i]-prices[i-1], 0);
// }
// return *max_element(result.begin(), result.end());
// }
// };
class Solution{
public:
int maxProfit(vector<int>& prices){
if(prices.empty())
return 0;
int min = std::numeric_limits<int>::max();//struct的static函数
vector<int> result(prices.size(), 0);
for(size_t i = 0; i < prices.size(); ++i){
if(prices[i] < min)
min = prices[i];
result[i] = prices[i] - min;
}
return *max_element(result.begin(), result.end());
}
};
前一种思路:
第i天抛出的收益有以下三种情况:
1、i-1之前就购入,持续持有到i天卖出;
2、i-1天购入,i天卖出;
3、i天购入并卖出,即0;
其中,由题意某天收益最小为0,即允许当天买进卖出,最小收益为0,因而第1种情况一定大于等于第2种,因而只需讨论1和3谁大谁小。
后一种更简单。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// class Solution {
// public:
// int maxProfit(vector<int>& prices) {
// int siz = prices.size();
// int max = 0;
// for(int i = 0; i < siz; ++i){
// for(int j = i+1; j< siz; ++j){
// if((prices[j]-prices[i])>max)
// max = prices[j]-prices[i];
// }
// }
// return max;
// }
// };
class Solution {
public:
int maxProfit(vector<int>& prices) {
int siz = prices.size();
if(siz == 0 || siz == 1) return 0;
int min = prices[0];
int max = 0;
for(int i = 1; i < siz; ++i){
if(prices[i] < min)
min = prices[i];
else{
if((prices[i]-min)>max)
max = prices[i]-min;
}
}
return max;
}
};
方法一:暴利遍历,把所有的可能都计算出来,保存最大值。需要两次遍历,时间复杂度O(N2)。
方法二:假设每一个i时刻抛出的情况下,与当前最小值相减,计算在i时刻抛出所能获得的最大利润。
若当前比min还小,此时抛出不赚钱,更新目前的最低价即可,后面都以此为买入的最低价。只需遍历一次,时间复杂度O(N)。