首页 > 代码库 > LeetCode Best Time to Buy and Sell Stock

LeetCode Best Time to Buy and Sell Stock

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int len = prices.size();
        if (len < 1) return 0;
        int minv = prices[0];
        int maxv = prices[0];
        int mprofit = 0;
        for (int i=1; i<len; i++) {
            int cur = prices[i];
            if (cur < minv) {
                minv = cur;
                maxv = cur;
            }
            if (cur > maxv) {
                maxv = cur;
                if (maxv - minv > mprofit) mprofit = maxv - minv;
            }
        }
        
        return mprofit;        
    }
};

这个解法应该算是贪婪吧,还可以把后缀序列的最大值求出来,然后在扫一边每个元素就可以知道如果当前买入,在后面的最高价是多少,从而求出最高利润,如果是负值则不进行交易,利润为0,下面给出dp版本的代码

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int len = prices.size();
        if (len < 2) return 0;
        vector<int> maxv(len, 0);
        maxv[len - 1] = prices.back();
        for (int i = len - 2; i>=0; i--) {
            if (prices[i] > maxv[i + 1]) {
                maxv[i] = prices[i];
            } else {
                maxv[i] = maxv[i + 1];
            }
        }
        int mprofit = 0;
        for (int i=0; i<len; i++) {
            int profit = maxv[i] - prices[i];
            if (profit > mprofit) mprofit = profit;
        }
        return mprofit;
    }
};

两者都是O(n)时间,只不过后者用了额外空间