我一开始以为这是简单题,我就直接暴力做法了。其实这道题目刚开始的时候暴力做法是可以去ac的,但是好像数据被加强了。双重循环好像不太可以了。
暴力做法如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0;
for(int i=0;i<prices.size();i++){
for(int j=i+1;j<prices.size();j++){
if(prices[j]>prices[i]) profit=max(profit,prices[j]-prices[i]);
}
}
return profit;
if(prices.size()<=1) return 0;
}
};
真无语
那么就用dp叭,这可能是最简单的dp了。
思路如下:
我们在遍历区间的过程中,记录了我们遍历区间的最小值,最大值。最小值需要我们去做差去使用,其实就是我们最后的结果,最后算出来的算法复杂度应该是O(n)
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()<=1) return 0;
int min_p=prices[0],max_p=0;
for(int i=1;i<prices.size();i++){
max_p=max(max_p,prices[i]-min_p);//min指的是前面i中价钱最小的
min_p=min(min_p,prices[i]);
}
return max_p;
}
};