【剑指offer】【动态规划】63. 股票的最大利润
题目链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/
朴素版
状态表示:相当于枚举在哪天卖, f[i]表示以prices[i]结尾的子数组的最大利润;
状态计算:f[i]的最大利润等于min(f[i - 1], prices[i] - min(prices[0 ~ i - 1]))
初始化:f[0] = 0;
时间复杂度:O(n) 空间复杂度:O(n)
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(!prices.size()) return 0;
int n = prices.size();
vector<int> f(n, 0);
for(int i = 1, min = INT_MAX; i < n; i++)
{
if(prices[i - 1] < min) min = prices[i - 1];
f[i] = max(f[i - 1], prices[i] - min);
}
return f[n - 1];
}
};
优化版
空间上还可以再优化,只需要一个变量来存储最终结果,中间结果都不需要。
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
int res = 0;
for(int i = 1, min = INT_MAX; i < n; i++)
{
if(prices[i - 1] < min) min = prices[i - 1];
res = max(res, prices[i] - min);
}
return res;
}
};
知识的价值不在于占有,而在于使用

浙公网安备 33010602011771号