码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode119-杨辉三角2(题目有Bug,动态规划)

时间:2018-08-02 12:26:01      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:直接   width   com   image   规划   ret   OWIN   ++   res   

技术分享图片

这明明是第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;

    }

 

LeetCode119-杨辉三角2(题目有Bug,动态规划)

标签:直接   width   com   image   规划   ret   OWIN   ++   res   

原文地址:https://www.cnblogs.com/weizhibin1996/p/9406284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!