题目的意思是整个过程中只能买一只股票然后卖出,也可以不买股票。也就是我们要找到一对最低价和最高价,最低价在最高价前面,以最低价买入股票,以最低价卖出股票。
算法复杂度:O(n)。
思路1:
设dp[i]是[0,1,2...i]区间的最大利润,则该问题的一维动态规划方程如下
dp[i+1] = max{dp[i], prices[i+1] - minprices} ,minprices是区间[0,1,2...,i]内的最低价格
//dp[i+1] = max{dp[i], prices[i+1] - minprices} ,minprices是区间[0,1,2...,i]内的最低价格
int maxProfit(vector<int> &prices) {
int n = prices.size();
if(n<=1) return 0;
int profit=prices[1]-prices[0];
int minpro = prices[0];
//找到最大的利润
for(int i=2; i<n; i++){
minpro = min(minpro, prices[i-1]);
if(profit < (prices[i]-minpro)){
profit = prices[i]-minpro;
}
}
//利润小于0的时候置0
if(profit<0)
profit = 0;
return profit;
}
思路2:
按照股票差价构成新数组 prices[1]-prices[0], prices[2]-prices[1], prices[3]-prices[2], ..., prices[n-1]-prices[n-2]。求新数组的最大子段和就是我们求得最大利润,假设最大子段和是从新数组第 i 到第 j 项,那么子段和= prices[j]-prices[j-1]+prices[j-1]-prices[j-2]+...+prices[i]-prices[i-1] = prices[j]-prices[i-1], 即prices[j]是最大价格,prices[i-1]是最小价格,且他们满足前后顺序关系。
int maxProfit(vector<int> &prices){
int n = prices.size();
if(n<=1) return 0;
int profit=0;
int sum=0;
for(int i=1; i<n; i++){
if(sum<=0){
sum = 0; //和小于0的时候要置0
sum += prices[i]-prices[i-1];
}
else{
sum += prices[i]-prices[i-1];
}
if(sum>profit){
profit = sum;
}
}
return profit;
}