一、题目描述
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3 输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0 输出: [1]
示例 3:
输入: rowIndex = 1 输出: [1,1]
提示:
0 <= rowIndex <= 33
二、解题思路
在杨辉三角中,每一行的第一个数和最后一个数都是1,其余的数是它正上方和左上方两个数的和。我们可以利用这个性质来逐行构建杨辉三角。
具体步骤如下:
- 初始化一个列表
result
,用于存放最终的结果,初始时只有一个元素1。 - 对于每一行,从倒数第二个元素开始,更新每个元素为它和它前一个元素的和。
- 在每一行的最后添加一个1。
- 重复步骤2和3,共
rowIndex
次。 - 返回最终的
result
列表。
三、具体代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> result = new ArrayList<>();
result.add(1);
for (int i = 0; i < rowIndex; i++) {
for (int j = i; j > 0; j--) {
result.set(j, result.get(j) + result.get(j - 1));
}
result.add(1);
}
return result;
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 外层循环执行了
rowIndex
次,即行数。 - 内层循环在最坏情况下(即最后一行)执行了
rowIndex
次,因为每次循环都会将当前位置的元素更新为前两个元素的和。 - 因此,内层循环的总执行次数是1 + 2 + 3 + … + rowIndex,这是一个等差数列求和,其和为((1 + rowIndex) * rowIndex) / 2。
- 综合外层循环和内层循环,总的时间复杂度是O(rowIndex^2)。
2. 空间复杂度
- 结果列表
result
的大小随着行数的增加而增加,最终大小为rowIndex + 1
。 - 因此,空间复杂度主要取决于结果列表的大小,即O(rowIndex)。
综上所述,代码的时间复杂度是O(rowIndex^2),空间复杂度是O(rowIndex)。
五、总结知识点
-
列表(List)的使用:
List<Integer>
是 Java 中的泛型列表,用于存储整数类型的数据。在这里,它被用来存储杨辉三角的每一行数据。 -
ArrayList 的初始化:
ArrayList<Integer> result = new ArrayList<>();
初始化一个新的 ArrayList 对象。 -
列表添加元素:
result.add(1);
用于在列表的末尾添加一个元素。 -
循环结构:
for
循环用于重复执行一系列操作。这里有双层循环,外层循环用于控制行数,内层循环用于更新每一行的元素值。 -
列表元素访问和修改:
result.get(j)
用于获取列表中索引为j
的元素值,result.set(j, value)
用于将列表中索引为j
的元素值设置为value
。 -
杨辉三角的性质:代码利用了杨辉三角的性质,即每一行的第一个和最后一个元素都是1,其他元素是它正上方和左上方两个元素的和。
-
数组的索引操作:在更新每一行元素时,代码通过索引来访问和修改列表中的元素。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。