题目
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
题解
根据杨辉三角的性质,利用下一行除了首尾两数其余都为上一行的两数之和。
时间和内存消耗为:
代码为:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list=new ArrayList<>();
if(rowIndex==0){
list.add(1);
return list;
}
if(rowIndex==1){
list.add(1);
list.add(1);
return list;
}
//List<Integer> tmp=new ArrayList<>()(Arrays.asList(1,1));
List<Integer> tmp=new ArrayList<>();
tmp.add(1);
tmp.add(1);
for(int i=2;i<=rowIndex;i++){
list=new ArrayList<>();
for(int j=0;j<=i;j++){
if(j==0||j==i){//首尾为1
list.add(1);
}else{
list.add(tmp.get(j-1)+tmp.get(j));
}
}
tmp=list;
}
return list;
}
}
题解2
杨辉三角的性质,还有一条是第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。那么每个数是前一个数的(n-i)/(i+1)倍。
时间和内存消耗为:
代码为:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list=new ArrayList<>();
long num=1;
for(int i=0;i<=rowIndex;i++){
list.add((int)num);
num=num*(rowIndex-i)/(i+1);
}
return list;
}
}