买卖股票的最佳时机

题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0


看起来就很像动态规划的题目。

维护前i个元素的最小值min_price,f[i]表示前i天的最大利润。

f[i] = min(f[i-1],a[i]-min_price)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> f(n);
f[0]=0;
int min_price = prices[0];
for(int i=1;i<n;i++){
min_price = min(min_price,prices[i]);
f[i]=max(f[i-1],prices[i]-min_price);
}
return f[n-1];
}
};

时空复杂度均为O(n)。

仔细观察会发现只会用到f[i]和f[i-1],所以空间复杂度可以优化为常数级别。

优化空间复杂度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> f(n);
f[0]=0;
int min_price = prices[0];
int max_profit = 0;
for(int i=1;i<n;i++){
min_price = min(min_price,prices[i]);
max_profit = max(max_profit,prices[i]-min_price);
}
return max_profit;
}
};