杨辉三角 II*简单
题目
杨辉三角 II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
- 你可以优化你的算法到 O(k) 空间复杂度吗?
解法1
分析
主要思路:借助前一篇的思路,只不过res集合并不会存储下来,而是把当前cur集合赋值给res,供下次使用。
代码 1ms 36.6MB
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
for (int i = 0; i <= rowIndex; i++) {
cur = new ArrayList<>();
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
cur.add(1);
} else {
cur.add(res.get(j-1)+res.get(j));
}
}
res = cur;
}
return cur;
}
解法2
分析
主要思路:相比于解法1更加优化,去掉中间res集合,直接在cur集合上操作;在第二层循环,采用倒叙遍历是为了避免当前对j位置的改变影响到后一次(j+1)值的计算;因为j位置的值取决于(j-1)和j的值,倒叙会先修改j的值,然后修改(j-1)的值。
代码 1ms 36MB
public List<Integer> getRow(int rowIndex) {
List<Integer> cur = new ArrayList<>();
cur.add(1);
for (int i = 1; i <= rowIndex; i++) {
for (int j = i-1; j > 0; j--) {
cur.set(j, cur.get(j)+cur.get(j-1));
}
cur.add(1);
}
return cur;
}
解法3:二项式定理
分析
主要思路:前面两种解法共同的特点是依据上层集合;本解法是直接计算需要返回集合中的每个值,普通人很难想到;这里有一个隐含的知识点:杨辉三角的值是(1+x)^n的二项展开式的系数。另外,需要声明为long类型,因为计算过程中会有小数点,long精度可以避免抹掉小数点导致错误。
代码 0ms 35.8MB
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new ArrayList<>();
long cur=1;
for (int i = 1; i <= rowIndex; i++) {
res.add((int)cur);
cur = cur * (rowIndex-i+1)/i;
}
res.add((int)cur);
return res;
}