Leetcode刷题68-121. 买卖股票的最佳时机(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/]

1.问题描述

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。
示例1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,
最大利润 = 6-1 = 5 。
注意:利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

2.我的解决方案

easy 类型题目。
最先想到的肯定是暴力法。
暴力法AC代码如下:

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

3.大神们的解决方案

方法:(DP 动态规划)
动态规划 前i天的最大收益 = max { 前i-1天的最大收益第i天的价格-前i-1天中的最小价格 }
mini记录当前的最便宜的股票
res记录当前最大利润

对于第i天的股票(prices[i]):
res = max(res , prices[i]-mini)
mini = min(mini, prices[i] ) // 更新mini

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

PS:但是实际提交的时候下面这个方法速度更快:
此方法也是动态规划的思想。代码大同小异。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int maxres=0;
        int size=prices.size();
        if(size==0) return 0;
        int temp=prices[0];
        for(int i=1;i<size;i++)
        {
            int diff=prices[i]-temp;
            if(diff>=0)
            {
                maxres=max(maxres,diff);
            }else
            {
               temp=prices[i];
            }
        }
        return maxres;
    }
};

4.我的收获

又是动态规划。。。

2019/4/28 胡云层 于南京 68

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/89644663