zoukankan      html  css  js  c++  java
  • 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;
    
        }

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

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

  • 相关阅读:
    @hdu
    @51nod
    @51nod
    @51nod
    JS-正则表达式常规运用
    CSS-复选框默认样式修改
    Vue-路由传参query与params
    Vue-阻止页面回退
    Vue-表单提交
    JS-原生的ajax
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9265097.html
Copyright © 2011-2022 走看看