• 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;
    
        }

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

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

  • 相关阅读:
    Object.keys
    数组内容深拷贝的应用
    CSS如何让页脚固定在页面底部
    vue eslint开发 关掉 tab错误提示
    input框,需要隐式显示的时候,不让它自动填充的办法
    关于BFC
    File协议与HTTP协议 以及区别
    关于缓存
    深拷贝浅拷贝 遇到了bug
    聚餐学习
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9265097.html
Copyright © 2020-2023  润新知