目录
1.暴力
计算出所有差值,然后找到最大的:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = (int)prices.size(), ans = 0;
for (int i = 0; i < n; ++i){
for (int j = i + 1; j < n; ++j) {
ans = max(ans, prices[j] - prices[i]);
}
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/solution/gu-piao-de-zui-da-li-run-by-leetcode-sol-0l1g/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
结果如下所示:
时间复杂度是O(n^2)
2.记录当前最小值
如果我们边遍历数组的过程也记录下前面的最小值,那么我们只需要遍历一次数组就好了,代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int inf = 1e9;
int minprice = inf, maxprofit = 0;
for (int price: prices) {
maxprofit = max(maxprofit, price - minprice);
minprice = min(price, minprice);
}
return maxprofit;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/solution/gu-piao-de-zui-da-li-run-by-leetcode-sol-0l1g/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
if(len==0) return 0;
int minNow=prices[0];
int maxMoney=0;
for(int i=1;i<len;++i)
{
int dif=prices[i]-minNow;
if(dif>maxMoney) maxMoney=dif;
if(prices[i]<minNow) minNow=prices[i];
}
return maxMoney;
}
};
后面这个结果如下所示:
时间复杂度是O(n)
3.动态规划
理解思想比较重要,我们看看大佬的分析过程:
虽然在编程上面好像有点差不多,但是大佬向我们展示了动态规划的思想,值得我们学习理解~