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;
    
        }
  • 相关阅读:
    线段树模板(HDU 6356 Glad You Came)
    Treap模板
    Codeforces Round #499 (Div. 2) D. Rocket题解
    Codeforces Round #499 (Div. 2) C Fly题解
    KMP与AC自动机模板
    HDU 6351 Naive Operations(线段树)
    python核心编程第六章练习6-13
    python核心编程第六章练习6-12
    [转]我为什么要学习python
    python核心编程第六章练习6-11
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9406284.html
Copyright © 2011-2022 走看看