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 <= numRosw <= 30
2. 解题思路
杨辉三角的性质:
- 三角形的每一行的第一个数字和最后一个数字都是1。
- 每一个三角的元素等于上一行此位置左边的元素与上一行此位置元素的和。
题解:
杨辉三角的第0行只有一个数:1。对于 1 ≤ i < numRows
。用pervRow
表示杨辉三角的第 i - 1
行,用curRow
表示杨辉三角的第 i
行.
- 将 1 添加到
curRow
,表示当前行的首个数是1 - 当前行的中间
i - 1
个数分别等于其上方两数之和,因此对于1 <= j < i
,有curRow[j] = pervRow[j] + pervRow[j - 1]
,依次将每个pervRow[j] + pervRow[j - 1]
添加到curRow
中。 - 将 1添加到
curRow
,表示当前行的末尾数是1. - 此时得到完整的
curRow
,将curRow
添加到杨辉三角。
3. 代码
class Solution { public List<List<Integer>> generate(int numRows) { // 定义一个二维数组 List<List<Integer>> ret = new ArrayList<>(); List<Integer> list = new ArrayList<>(); list.add(1); ret.add(list); for (int i = 1; i < numRows; i++) { // 每循环一次 就是一行 List<Integer> curRow = new ArrayList<>(); curRow.add(1); // 一行的第一个元素 // 处理中间元素 List<Integer> pervRow = ret.get(i - 1); for (int j = 1; j < i; j++) { int x = pervRow.get(j) + pervRow.get(j - 1); curRow.add(x); } //最后一个元素 curRow.add(1); ret.add(curRow); } return ret; } }
运行结果:
4. 复杂度分析
- 时间复杂度:O(numRows2),因为计算总数为 1 + 2 + 3 + …+ numRows。
- 空间复杂度:O(numRows2),因为每次计算都会被保留下来,因此空间复杂度的规模与时间复杂度相同。