【方法一:】
维护一个最小价格和最大利润,时间复杂度为n
int maxProfit(vector<int>& prices) {
int min_price = INT_MAX;
int max_profit = 0;
for (int i = 0; i < prices.size(); ++i) {
min_price = min(prices[i], min_price);
max_profit = max(max_profit, prices[i] - min_price);
}
return max_profit;
}
【方法二:动态规划】
- 1.确定状态
- f[i]表示前i天的最大利润
- 子问题:前i天的最大利润=前i-1天的最大利润与第i天的利润做比较
- 还是要维护一个最小价格
- 2.转移方程
- f[i]=max(f[i-1],prices[i]-min_prices)
- 3.初始化和边界条件
- f[0]=0
- 4.计算顺序
- 从小到大
int maxProfit(vector<int>& prices)
{
int min_price = prices[0];
int n = prices.size();
vector<int> f(n);
f[0] = 0;
for (int i = 1; i < n; i++) {//注意这里是从1开始
min_price = min(min_price, prices[i]);
f[i] = max(f[i - 1], prices[i] - min_price);
}
return f[n-1];
}
【方法三:暴力法】
int maxProfit(vector<int>& prices) {
int res = INT_MIN;
for (int i = 0; i < prices.size(); i++)
{
for (int j = i + 1; j < prices.size(); j++) {
if (prices[j] > prices[i]) {//卖出价格必须必买入价格贵
res = max(prices[j] - prices[i], res);
}
}
}
if (res == INT_MIN)res=0;
return res;
}
该方法在牛客上可以通过,但是在leetcode上超过了时间限制