一、题目
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1 输出: [[1]]
二、思路
动态规划的思路解决:
// dp[i][j] 表示第i行第j个元素 //递推公式不难发现: dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; //初始化的话,每一行的第一个元素和最后一个元素都为1
三、代码
class Solution {
public List<List<Integer>> generate(int numRows) {
//创建dp数组
Integer[][] dp = new Integer[numRows][];
//遍历每一行
for(int i = 0 ;i < numRows;i++) {
//初始化当前行,第0行有一个元素,第1行有2个元素,以此类推,每一行的大小都不一样。在这
里初始化,空间利用率高
dp[i] = new Integer[i + 1];
//每一行的第一个和最后一个元素总是1
dp[i][0] = dp[i][i] = 1;
//计算中间元素
for(int j = 1; j < i;j++) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
}
}
//将数组转换为结果列表
List<List<Integer>> result = new ArrayList<>();
for(Integer[] row :dp) {
result.add(Arrays.asList(row));
}
//返回结果
return result;
}
}