问题描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
直接大神代码,今天下午脑袋宕机。
例如这是rowIndex = 6 时的情况
1st: 1=1
2nd: 6= 6 / 1
3rd: 15=6x5 / (1x2)
4th: 20=6x5x4 / (1x2x3)
5th: 15=6x5x4x3 / (1x2x3x4)
6th: 6 =6x5x4x3x2 / (1x2x3x4x5)
7th: 1 =6x5x4x3x2x1 / (1x2x3x4x5x6)
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new LinkedList<>();
res.add(1);
if (rowIndex == 0) return res;
int t = rowIndex, b = 1;
long cur = 1;
for(int i = 1; i < rowIndex+1; i++){
cur = cur * t;
cur = cur / b;
res.add((int)cur);
t--;b++;
}
return res;
}
}
再来个模拟 O(k)
第k行的长度是k+1,所以用这个长度创建一个ArrayList,然后填满所有的1。
给定行n的值可以从行n-1计算出来,例如:
第n行索引i处的值是第n-1行索引i和i-1处的值的和
正确处理索引绑定,注意每行的第一个和最后一个值总是1。
为了只使用O(k)额外的空间,我们从列表末尾向后计算每一行,
这样我们就可以重用列表,而不用重写任何值,就像从第n-1行开始一样
此问题需要纵向看
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
class Solution {
public List<Integer> getRow(int rowIndex) {
if(rowIndex < 0) return null;
ArrayList<Integer> res = new ArrayList<>(rowIndex+1);
for(int k=0; k<=rowIndex; ++k) res.add(1);
for(int i=1; i<rowIndex; ++i){
for(int j=i; j>0; --j) {
res.set(j, res.get(j) + res.get(j-1));
}
}
return res;
}
}