买卖股票的最佳时机
题目描述
给定一个数组 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; } };
|