1. 程式人生 > >119. 楊輝三角 II(java)

119. 楊輝三角 II(java)

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

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

示例:

輸入: 3
輸出: [1,3,3,1]程式碼一:
class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> list = new ArrayList<>();
        if (rowIndex < 0)
            return list;
        list.add(1);
        if (rowIndex == 0)
            return list;
        for (int i = 1; i <= rowIndex ; i++) {
            for (int j = list.size()-1; j > 0; j--) {
                list.set(j,list.get(j-1)+list.get(j));
            }
            list.add(1);
        }
        return list;

    }
}

進階:

你可以優化你的演算法到 O(k) 空間複雜度嗎?

思路:

在O(k)的空間複雜度的限制下,在長度為k的陣列內部,從楊輝三角的第一行開始依次計算到第k行的最終結果。

程式碼中i的值是第k行,j是第j個數。j從i開始,是因為第i行共有i+1個數字,從後往前計算,避免了第i-1行計算結果被覆蓋丟失。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

每一個數組都比上一個陣列多一個數,第一位和最後一位都是1, 其餘數字都是上一個陣列對應位置和前一位置的數字的和 a[i][j] = a[i-1][j] + a[i-1][j-1]


class Solution {
    public List<Integer> getRow(int rowIndex) {
        Integer[] result = new Integer[rowIndex+1];//new一個集合類物件,陣列中有rowIndex個元素
        Arrays.fill(result, 0);//填充0
        result[0] = 1;
        for(int i = 1; i<result.length; i++) {
            for(int j=i;j>0;j--) {
                result[j] = result[j] + result[j-1];
            }
        }
        return Arrays.asList(result);//返回一個受指定陣列支援的固定大小的列表(result)
    }
}