LeetCode之楊輝三角二(簡單模擬)
阿新 • • 發佈:2018-11-07
問題描述:
給定一個非負索引 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;
}
}