題目
給定一個非負索引 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;
}
}