leetcode刷题之旅——121. Best Time to Buy and Sell Stock



        一道动态规划当中的简单题目,先拿简单题目加深自己对动态规划的理解。

题目大意:

        给定我们一个数组,里面的第i个数字代表第i天的袜子价格,我们所需要做的就是以低价买入,高价卖出。最后我们返回我们可以获得利润的最大值。

例子:

        example 1:      

        Input: [7, 1, 5, 3, 6, 4]
        Output: 5

        max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

        example 2:

        Input: [7, 6, 4, 3, 1]
        Output: 0

        In this case, no transaction is done, i.e. max profit = 0.

算法:

        刚开始阅读这道题目,可能会想到一种算法就是从数组当中找到最小值,然后再找到最大值,相减就是最大利润。但是,这种算法会出错,因为最高价可能会出现在最低价前面。我们利用动态规划的方法来做这道题,首先我们当然要遍历整个数组,对于每个数我们判断其是否比当前最小值要小,然后更新最小值。这样做是为了在后面出现高价的时候,保证我们的利润最大。然后,如果当前值大于最小值,我们就用其减去最小值看看是否利润大于我们当前的利润。然后对于我们的利润进行更新,这样做保证了我们的利润是最大值。这样做的时间复杂度为O(n)。

代码:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值