LeetCode118. Pascal's Triangle 杨辉三角

题目

给定行数,生成对应的杨辉三角

思考

  1. 同一行是对称的,最大的下标为(行数+1)/2;1,1,2,3,6;下标从0开始,则对应分别为0.0.1.1.2.2
  2. 对于第偶数行,个数也是偶数,对于奇数行,个数也是奇数
  3. 而且对于非第一列的数,d[i][j]=d[i-1][j-1]+d[i-1][j]

后面通过编程实现,发现自己第一个条件是完全没有用的,可以不需要用到对称性,直接由上一行计算下一行(即第三条)。
而且忘记说最后一列了。

所以新的思考点是:

  1. 对于非第一列/最后一列的数,d[i][j]=d[i-1][j-1]+d[i-1][j]
  2. 第一列和最后一列初始化为1即可

出现过的错误

粗心

由于粗心把当前行数i用总行数numRows代替,所以出现了下标出界的情况Line 18: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

没想清楚

还有没想清楚关于对称点和i、j的关系,所以总是出界。最后考虑取消这个点,从总体情况考虑。

局部变量带来的问题

lineInts声明在函数域中,结果放入总的嵌套List中出了问题。然后在for的局部域中声明这个变量,问题就解决了。

代码

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> results=new ArrayList<List<Integer>>(numRows);
        
        for(int i=0;i<numRows;i++){//i代表当前行数-1
            ArrayList<Integer> lineInts=new ArrayList<Integer>();//这一行的数字
            lineInts.add(1);//每行第一个是1
            int j=1;
            for(;j<i;j++){
                int sum=results.get(i-1).get(j-1)+results.get(i-1).get(j);
                lineInts.add(sum);
            }
            if(i>0)
            	lineInts.add(1);//最后加一个1
            
            results.add(lineInts);
        }
        return results;
    }

总结

成绩是32%,应该还有优化的地方,回头再考虑一下吧。

原文地址:https://www.cnblogs.com/FannyChung/p/6545467.html