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;

    }

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

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

 

 

posted @ 2018-07-04 20:05  朋友圈  阅读(137)  评论(0编辑  收藏  举报