给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
解法1:
第n行第k列的值,可以通过通项公式:(n-1)! / (k-1)!(n-k)! 计算得到
对其进行化简 (n-1)*(n-2)*...(n-k)/(k-1)!
直接求阶乘注意是否超出类型范围
class Solution {
public List<Integer> getRow(int rowIndex) {
rowIndex++;
ArrayList<Integer> row = new ArrayList<>();
for(int k = 1; k <= rowIndex; k++) {
long v = 1;
for(int i = 1; i < k; i++) {
v = v * (rowIndex - k + i) / i;
}
row.add((int)v);
}
return row;
}
}
解法2:
图解,沿用之前求杨辉三角的思路;优化,可以复用数组,不用讲所有的行都保存下来;进一步优化,利用杨辉三角的对称性,求出前半部分,后边也就可以镜像得出
class Solution {
public List<Integer> getRow(int rowIndex) {
ArrayList<Integer> row = new ArrayList<>();
row.add(1);
//保存一下上一个变量,由于本行相加之后,会将此值覆盖,但是下一位的计算还需要之前的值,所以临时存下
int pre = 1;
for(int i = 1; i <= rowIndex; i++) {
for(int j = 1; j < i; j ++) {
int tmp = row.get(j);
row.set(j, pre + row.get(j));
pre = tmp;
}
row.add(1);
}
return row;
}
}