LeetCode121-买卖股票的最佳时机

这道题其实一开始知识一道数组类别的题目,然而动态规划的思想就是厉害。

其实问题就是选一个买进的日期,然后在后面的区间内求最大值。

假如第一天买入,在后面的天数内找到最大值。

第二天买入,在后面的天数内找到最大值。

这是递归的思想。

那么改成自底向上呢?

我们只要从后面开始,一直维护一个最大值数组即可。

数组第i个元素,存的是i~n里的最大值。

public int maxProfit(int[] prices) {

        int len = prices.length;

        //没有交易完成,最大利润是0
        int max = 0;

        //最后一个不用管
        for(int i=len-2;i>=0;i--){

            int cur = prices[i];
            int next = prices[i+1];

            //当前比后面区间的最大值要小,就是有钱赚
            if(cur<next){

                int temp = next-cur;
                if(temp>max)
                    max=temp;

                //更新当前的元素,将它的值,设为这个区间内最大值,也是就后面的元素
                prices[i]=next;

            }else if(cur>next){

                //如果当前比后面区间的大,就是没钱赚
                //因为后面是卖出的价格,比你今天买入的都低

                //不用更新当前区间最大值,因为最大值是它自己

            }else{

                //如果是等于
                //那么也没钱赚,最大值也是他自己

            }

        }

        return max;

    }

一次通过,并且基本上是最优解了。

递归是函数调用,会花额外的时间。

猜你喜欢

转载自www.cnblogs.com/weizhibin1996/p/9265097.html
今日推荐