题目描述
给定一个非负整数 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
核心思路
- 初始化:创建一个结果列表
res用于存储每一行的数据。 - 逐行构建:
- 对于每一行
i(从0到numRows-1),创建一个长度为i+1的数组。 - 将每行的首尾元素设置为
1。 - 对于中间的元素,每个元素等于上一行的同列和前一列元素之和。
- 对于每一行
- 添加行:将当前行转换为列表并添加到结果列表中。
代码实现
1 | public List<List<Integer>> generate(int numRows) { |
复杂度分析
- 时间复杂度:
O(numRows²)。需要计算每个元素,总元素数量约为numRows²/2。 - 空间复杂度:
O(numRows²)。存储整个杨辉三角所需的空间。
附录
如何理解这个公式
递推式:c[i][j] = c[i−1][j−1] + c[i−1][j]
本质上是一个组合数恒等式,其中 c[i][j] 表示从 i 个不同物品中选出 j 个物品的方案数。如何理解上式呢?考虑其中某个物品选或不选:
- 选:问题变成从剩下
i−1个不同物品中选出j−1个物品的方案数,即c[i−1][j−1]。 - 不选:问题变成从剩下
i−1个不同物品中选出j个物品的方案数,即c[i−1][j]。
二者相加(加法原理),得:c[i][j] = c[i−1][j−1] + c[i−1][j]