问题背景
给定一个非负索引 r o w I n d e x rowIndex rowIndex,返回「杨辉三角」的第 r o w I n d e x rowIndex rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
数据约束
- 0 ≤ r o w I n d e x ≤ 33 0 \le rowIndex \le 33 0≤rowIndex≤33
解题过程
这题其实之前做过,定义列表并且按规则计算对应位置上的值即可。
另外考虑到要求的结果范围有限,也可以先打表,根据实际情况返回结果。这种做法严格地说来不符合 O ( r o w I n d e x ) O(rowIndex) O(rowIndex) 的空间要求,但其实效率非常不错。
具体实现
模拟计算
class Solution {public List<Integer> getRow(int rowIndex) {if (rowIndex == 0) {return List.of(1);}List<Integer> pre = new ArrayList<>();pre.add(1);pre.add(1);List<Integer> res;while (--rowIndex > 0) {res = new ArrayList<>(pre);for (int i = 1; i < pre.size(); i++) {res.set(i, pre.get(i - 1) + pre.get(i));}res.add(1);pre = new ArrayList<>(res);}return pre;}
}
打表预处理
class Solution {private static final int MAX_N = 34;private static final List<Integer>[] res = new List[MAX_N];static {res[0] = List.of(1);for (int i = 1; i < res.length; i++) {List<Integer> row = new ArrayList<>(i + 1);row.add(1);for (int j = 1; j < i; j++) {row.add(res[i - 1].get(j - 1) + res[i - 1].get(j));}row.add(1);res[i] = row;}}public List<Integer> getRow(int rowIndex) {return res[rowIndex];}
}