https://leetcode.cn/problems/pascals-triangle/
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 :
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
public class hot118 {
//动态规划
public List<List<Integer>> generate(int numRows) {
// 结果列表,用于存储杨辉三角的所有行
List<List<Integer>> res = new ArrayList<>();
// 遍历每一行
for (int i = 0; i < numRows; i++) {
// 创建当前行的列表
List<Integer> row = new ArrayList<>();
// 遍历当前行的每一个元素,从第0个到第i个(每行有i+1个元素)
for (int j = 0; j <= i; j++) {
// 判断是否为行首或行尾元素
if (j == 0 || j == i) {
// 杨辉三角的边界条件:每行的第一个和最后一个元素都是1
row.add(1);
} else {
// 中间元素的计算:等于左上方和右上方元素的和
// 左上方元素:上一行第(j-1)个元素
int left = res.get(i - 1).get(j - 1);
// 右上方元素:上一行第j个元素
int right = res.get(i - 1).get(j);
// 将两者的和添加到当前行
row.add(left + right);
}
}
// 将构建好的当前行添加到结果列表中
res.add(row);
}
// 返回完整的杨辉三角
return res;
}
//基于前一行生成新行
public List<List<Integer>> generate2(int numRows) {
List<List<Integer>> res = new ArrayList<>();
if (numRows == 0) return res;
// 添加第一行
List<Integer> firstRow = new ArrayList<>();
firstRow.add(1);
res.add(firstRow);
// 基于前一行生成当前行
for (int i = 1; i < numRows; i++) {
List<Integer> prevRow = res.get(i - 1);
List<Integer> currentRow = new ArrayList<>();
currentRow.add(1); // 行首
// 计算中间元素
for (int j = 1; j < i; j++) {
int sum = prevRow.get(j - 1) + prevRow.get(j);
currentRow.add(sum);
}
currentRow.add(1); // 行尾
res.add(currentRow);
}
return res;
}
}
914

被折叠的 条评论
为什么被折叠?



