【LeetCode】118.杨辉三角

62 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

题目

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

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

img

示例 1

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2

输入: numRows = 1
输出: [[1]]

提示

  • 1 <= numRows <= 30

题解

思路

理解:不看题给的三角形动态图,以返回的数组角度观察,可以得到规律为:

数组第一项(也是杨辉三角第一行)必为 [1],然后生成第二行时我们给第一行左右处额外添加两个 0 值,得到 [0,1,0],

此时该数组第一项+第二项=0+1=1作为第二行的第一个元素,第二项+第三项作为第二个元素,此时第三项是 [0,1,0] 数组的最后一个元素

所以我们已经完成了第二行的布置,也就是 [1,1]

生成第三行同理,额外添 0 得 [0,1,1,0],然后重复当两两相加得一个元素,直至所有元素被利用完。

同时我们可以发现每行的元素数量等于该行的行数

所以我们要做的就是根据题传行数,生成各行的数组,每生成完一行数组,就将其添加到结果数组中。

代码

class Solution {
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> nums = new ArrayList<List<Integer>>();
        List<Integer> pre = new ArrayList<Integer>();
        
        int in = 0;
        pre.add(1);
        nums.add(pre);
        
        for(int i = 1; i<numRows; i++){
        	List<Integer> now = new ArrayList<Integer>();
            for(int j = 0; j<=i;j++){
                if(j == 0 || j == i){
                    in = pre.get(0); 
                }else{
                    in = pre.get(j-1) + pre.get(j); 
                }
                now.add(in);
            }
            nums.add(now);
            pre.add(0);
            Collections.copy(pre, now);
        }
        return nums;
    }
}

结语

业精于勤,荒于嬉;行成于思,毁于随。