题目描述
给定一个非负整数 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;
}
}