【LeetCode】第118题——杨辉三角(难度:简单)

题目描述

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

  1. 示例: 输入: 5 输出:

解题思路

采用双循环,外层循环负责第i层,内层循环负责第i层的第j个元素。

除了第0行外,前后都是1,因此可以把前后的1提出放在外循环中。

代码详解

class Solution {
          
   
    public List<List<Integer>> generate(int numRows) {
          
   
        ArrayList<List<Integer>> list1 = new ArrayList<>();
        // 如果numRows为0,则不参与循环直接返回空的list1,也正确
        // 外循环
        for(int i = 0; i < numRows; ++i) {
          
   
            ArrayList<Integer> list2 = new ArrayList<>();	// 注意这里一定要新建,.clear()有问题
            list2.add(1);	// 前面的1
            for(int j = 0; j < i-1; ++j) {
          
   
                if (list1.get(i-1).size() >= 2) {
          
   	// 需要上一层的元素大于等于两个才能进行相加
                    list2.add(list1.get(i-1).get(j) + list1.get(i-1).get(j+1));
                }
            }
            if(i >= 1) {
          
   	// 除第0行外,都有后面的1
                list2.add(1);
            }
            list1.add(list2);
        }
        return list1;
    }
}

注意点

  1. 第一次做的时候在循环外new了list2对象,然后用clear()进行所谓的“清空”,实则会连带外层的list1。
  2. 不要怕双循环会超时。想了半天不用双循环的方法,想不出来去看题解,发现题解也是双循环,好气哟。
经验分享 程序员 微信小程序 职场和发展