zoukankan      html  css  js  c++  java
  • LeetCode119-杨辉三角2(题目有Bug,动态规划)

    这明明是第4行....

    一次通过还是美滋滋

     

    说一下思路

    因为这种由上面的一列 构成 下一列的结构,肯定是用一个数组保存,然后更新就可以了。

    又有,第一个和最后一个都是1,中间的比如i位置,是由上一列的i和i-1加起来的。

    那么假如数组里面存的是上一列的值,每次只要更新1~row-1的值就行了。

    row-1位置存的是上一列row-1的值,左边是row-2的值,那么只要(row-1)+(row-2),就是当前列row-1的值了

    从右边开始算起,能够保证左边的值都用来计算,不受影响,因为需要i和i-1啊,肯定从右边算起。

    比如计算第四行,当前的数组是[1,2,1]

    因为每行最后一位是1,那么直接在最后添加1 【1,2,1,1】

    计算倒数第二个值的时候

    【1,2,1】

    【1,2,1,1】

    其实他现在的值,就是上一列该位置的值,前面的值,就是上一列前面的值。

    那么就是【1,2,3,1】

    继续

    【1,3,3,1】

    OK了

    所以,只有有上一列的值,就能算出当前列的值,因为最多是34行,那么只要创建34大的数组即可。

    至于这个灵感怎么来的,是从背包问题的优化的来的,背包最后也是只使用一行就行。

    public static List<Integer> getRow(int rowIndex) {
    
    
            int [] array = new int [34];
    
            array[0]=1;
    
            array[1]=1;
    
            //要一直算到第row行
            for(int i=2;i<=rowIndex;i++){
    
                //对于每一列,从右边开始构造
    
                //最右边是1,第一位是1
                array[i]=1;
    //            array[0]=1;
    
                //其余的就是该位置原来的数字+前一位的数字
    
                for(int j=i-1;j>0;j--){
                    array[j] = array[j]+array[j-1];
                }
    
            }
    
            List<Integer> result = new ArrayList<>();
    
            for(int i=0;i<=rowIndex;i++){
                result.add(array[i]);
            }
    
            return result;
    
        }
  • 相关阅读:
    【ES6】函数的扩展
    NSFileManger使用介绍
    委托,曾将让我头疼难以理解
    【HDOJ】1914 The Stable Marriage Problem
    MySQL修改配置优化插入性能
    MySQL配置文件的编码问题
    MyBatis批量更新时提示"You have an error in your SQL syntax"
    MyBatis批量更新返回受影响数
    log4j.properties配置说明
    删除Win10的OneDrive
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9406284.html
Copyright © 2011-2022 走看看