一、题目描述
给定一个非负整数 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
二、解题思路
这个问题是要求生成杨辉三角的前 numRows
行。杨辉三角的特点是每行的第一个和最后一个元素都是1,其他元素是它正上方元素和左上方元素之和。
解题思路如下:
- 创建一个二维列表
result
用于存储杨辉三角的每一行。 - 对于每一行,首先添加一个1作为该行的第一个元素。
- 对于行号大于1的情况,需要计算中间的元素,每个元素都是它正上方元素和左上方元素之和。
- 在每行的最后添加一个1。
- 将每一行添加到
result
列表中。 - 返回
result
作为最终结果。
三、具体代码
import java.util.ArrayList;
import java.util.List;class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> result = new ArrayList<>();for (int i = 0; i < numRows; i++) {List<Integer> row = new ArrayList<>();row.add(1); // 每行的第一个元素是1// 计算中间的元素for (int j = 1; j < i; j++) {row.add(result.get(i - 1).get(j - 1) + result.get(i - 1).get(j));}// 如果不是第一行,每行的最后一个元素也是1if (i > 0) {row.add(1);}result.add(row);}return result;}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 外层循环执行了
numRows
次,这是生成杨辉三角行的次数。 - 内层循环的执行次数随着行数的增加而增加,第
i
行需要执行i-1
次。 - 因此,内层循环的总执行次数是
1 + 2 + 3 + ... + (numRows - 1)
,这是一个等差数列求和,其和为(numRows - 1) * numRows / 2
。 - 每次内层循环的操作是常数时间的,即
O(1)
。 - 所以,总的时间复杂度是
O((numRows - 1) * numRows / 2)
,这可以简化为O(numRows^2)
。
2. 空间复杂度
- 空间复杂度主要取决于存储杨辉三角所需的二维列表
result
。 result
包含numRows
行,每行的元素数量从 1 个递增到numRows
个。- 因此,
result
中的总元素数量是1 + 2 + 3 + ... + numRows
,这也是一个等差数列求和,其和为(numRows + 1) * numRows / 2
。 - 每个元素的空间是常数大小的,所以总的空间复杂度是
O((numRows + 1) * numRows / 2)
,这可以简化为O(numRows^2)
。
综上所述,给定代码的时间复杂度是 O(numRows^2)
,空间复杂度也是 O(numRows^2)
。
五、总结知识点
-
杨辉三角:杨辉三角是一个经典的数学问题,其中每个数是它左上方和右上方的数的和。这个问题在计算机科学中经常用来练习动态规划和递归算法。
-
二维列表(ArrayList 的嵌套):代码中使用了一个
ArrayList
的嵌套来存储杨辉三角的每一行,每一行也是一个ArrayList
。 -
循环结构:代码使用了两个嵌套的
for
循环来生成杨辉三角。外层循环用于处理行,内层循环用于处理每行中的元素。 -
列表的添加操作:代码中使用了
ArrayList
的add
方法来向列表中添加新的元素。 -
列表的访问操作:代码中使用了
get
方法来访问列表中的元素,以便计算当前行的中间元素。 -
边界条件处理:代码中对于每行的第一个和最后一个元素进行了特殊处理,确保每行都以1开始和结束。
-
动态规划的思想:虽然代码没有显式地使用动态规划,但它在计算每一行的元素时利用了上一行的结果,这是动态规划的一种应用。
-
数组索引:在计算中间元素时,代码使用了数组索引来访问上一行的相邻元素。
-
常数时间的操作:除了生成杨辉三角的结构之外,代码中的每次操作(如列表的添加和访问)都是常数时间的。
-
递推关系:杨辉三角的每一行都可以根据上一行来递推生成,这是解决这类问题的常见方法。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。