起初遍历查找最小值和最小值之后的最大值,返回差值,但测试用例 [2,4,1]就过不了了;随后看着跟上升数组有关,试了一下O(n^2)时间复杂度的遍历方法,居然过了。
暴力
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans=0,size=prices.size();
for(int i=0;i<size-1;i++){
int tmp;
for(int j=i+1;j<size;j++){
if(prices[j]>prices[i]){
tmp=prices[j]-prices[i];
if(tmp>ans){
ans=tmp;
}
}
}
}
return ans;
}
};
动规
参考解答:面试题63. 股票的最大利润(动态规划,清晰图解)
动规先定义,dp[i]表示以prices[i]结尾的子数组的最大利润。关键是状态转移方程:dp[i]=max(dp[i-1],price[i]-min(prices[0:i]));再优化为profit=max(profit,prices-min(cost,prices[i])), K神用cost记录遍历查找最小值的过程,用profit记录dp[i]的过程,简直是妙啊!
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0,cost=INT_MAX;
for(auto x:prices){
cost=min(cost,x);
profit=max(profit,x-min(x,cost));
}
return profit;
}
};