1. 程式人生 > >LeetCode之楊輝三角二(簡單模擬)

LeetCode之楊輝三角二(簡單模擬)

問題描述:

給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 行。

在楊輝三角中,每個數是它左上方和右上方的數的和。

示例:

輸入: 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;
    }
}