【剑指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; 
    }
};
posted @ 2020-06-02 16:34  NaughtyCoder  阅读(145)  评论(0)    收藏  举报