## 题目
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
示例 3:
输入: rowIndex = 1
输出: [1,1]
提示:
0 <= rowIndex <= 33
解题
方法一:递推
思路
杨辉三角中每行第一个元素与最后一个元素固定是 1
,其他元素是其 左上元素 + 右上元素
。初始化第一行只有一个元素 1
其它行依次计算即可,推出到对应行的整个杨辉三角返回最后一行即可。
代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> triangleList = new ArrayList<>();
List<Integer> firstRow = new ArrayList<>();
firstRow.add(1);
triangleList.add(firstRow);
for (int i = 1; i <= rowIndex; i++) {
List<Integer> row = new ArrayList<>();
row.add(1);
triangleList.add(row);
for (int j = 1; j < i; j++) {
List<Integer> prevRow = triangleList.get(i - 1);
row.add(prevRow.get(j - 1) + prevRow.get(j));
}
row.add(1);
}
return triangleList.get(rowIndex);
}
}
优化:滚动数组
不同于 118. 杨辉三角 ,这个题只需要返回对应单行的杨辉三角即可,可以使用滚动数组进行空间优化。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
prevRow.add(1);
for (int i = 1; i <= rowIndex; i++) {
List<Integer> currRow = new ArrayList<>();
currRow.add(1);
for (int j = 1; j < i; j++) {
currRow.add(prevRow.get(j - 1) + prevRow.get(j));
}
currRow.add(1);
prevRow = currRow;
}
return prevRow;
}
}
优化:单数组
由于当前行中元素 j
是由上一行的 j - 1
元素与 j
元素加和计算出来的,故倒序计算当前行即不会覆盖所需的上一行数据。
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
row.add(1);
for (int i = 1; i <= rowIndex; i++) {
row.add(0); // 占位 当前行比上一行多一个元素
for (int j = i; j > 0; j--) {
row.set(j, row.get(j - 1) + row.get(j));
}
}
return row;
}
}
评论区