力扣 面试题63. 股票的最大利润 贪心/dp

https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/

力扣 面试题63. 股票的最大利润 贪心/dp_第1张图片

思路一:贪心,因为只能买卖一次,所以只要知道 [ 1 … i ] [1…i] [1i]的最小值 M i n i Min_i Mini [ i … n ] [i…n] [in]的最大值 M a x i Max_i Maxi,就可以更新 a n s = m a x ( a n s , M a x i − M i n i ) ans=max(ans,Max_i-Min_i) ans=max(ans,MaxiMini)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int siz=prices.size();
        if(!siz)
            return 0;
        vector<int> MIN(siz);
        MIN[0]=prices[0];
        for(int i=1;i<siz;i++)
            MIN[i]=min(MIN[i-1],prices[i]);
        int MAX=0,ans=0;
        for(int i=siz-1;i>=0;i--)
        {
            MAX=max(MAX,prices[i]);
            ans=max(ans,MAX-MIN[i]);
        }
        return ans;
    }
};

思路二:上面的实现比较笨,遍历了两遍,其实一遍就可以。考虑用 d p [ i ] dp[i] dp[i]表示前 i i i天所能获得的最高利润,那么: d p [ i ] = m a x ( d p [ i − 1 ] , p r i c e [ i ] − M i n i ) dp[i]=max(dp[i-1],price[i]-Min_i) dp[i]=max(dp[i1],price[i]Mini)其中 M i n i Min_i Mini表示前 i − 1 i-1 i1天内的最低价格。那么只需要扫一遍就可以得到答案了,同时只需两个变量就可以完成。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int siz=prices.size();
        if(!siz)
            return 0;
        int MIN=prices[0];
        int ans=0;
        for(int i=1;i<siz;i++)
        {
            ans=max(ans,prices[i]-MIN);
            MIN=min(MIN,prices[i]);
        }
        return ans;
    }
};

你可能感兴趣的:(面试题,贪心,dp,动态规划)