[热题100] 118. 杨辉三角

120 阅读1分钟

题目描述

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

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

示例 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

思路

耗时大概十分钟,先推导dp公式,用dp数组表示,然后用List实现。

两侧的值永远是1,这个可以根据列来判断

中间的值取决于行和列,行>1的时候,当前列等于上一行当前列-1位置的值+上一行当前列的值的和

实现

class Solution {
    public List<List<Integer>> generate(int numRows) {
        // dp 00 = 1
        // dp 10 = 1, 11 = 1
        // dp 20 = 1, 21 = 10+11, 22 = 1
        
        // if (j == 0 || j == i) {
        //     dp[i][j] = 1;
        // } else {
        //     dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
        // }

        int n = numRows;
		List<List<Integer>> res = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			List<Integer> row = new ArrayList<>();
			for (int j = 0; j <= i; j++) {
				if (j == 0 || j == i) {
				    row.add(1);
				} else {
				    // dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
					row.add(res.get(i-1).get(j-1) + res.get(i-1).get(j));
				}
			}
			res.add(row);
		}
		return res;
        
    }
}