1. 程式人生 > 其它 >[LeetCode] #119 楊輝三角 II

[LeetCode] #119 楊輝三角 II

[LeetCode] #119 楊輝三角 II

給定一個非負索引 rowIndex,返回「楊輝三角」的第 rowIndex行。

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

輸入: rowIndex = 3

輸出: [1,3,3,1]

參考[LeetCode] #118 楊輝三角

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        for (int
i = 0; i <= rowIndex; i++) { List<Integer> row = new ArrayList<Integer>(); for (int j = 0; j <= i; j++) { if (j == 0 || j == i) row.add(1); else row.add(res.get(i - 1).get(j - 1) + res.get(i - 1).get(j)); } res.add(row); }
return res.get(rowIndex); } }

注意到對第i+1行的計算僅用到了第i行的資料,因此可以使用滾動陣列的思想優化空間複雜度。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> pre = new ArrayList<Integer>();
        for (int i = 0; i <= rowIndex; ++i) {
            List<Integer> cur = new
ArrayList<Integer>(); for (int j = 0; j <= i; ++j) { if (j == 0 || j == i) { cur.add(1); } else { cur.add(pre.get(j - 1) + pre.get(j)); } } pre = cur; } return pre; } }

只用一個數組,我們可以倒著計算當前行,這樣計算到第i項時,第i-1項仍然是上一行的值。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> row = new ArrayList<Integer>();
        row.add(1);
        for (int i = 1; i <= rowIndex; ++i) {
            row.add(0);
            for (int j = i; j > 0; --j) {
                row.set(j, row.get(j) + row.get(j - 1));
            }
        }
        return row;
    }
}

知識點:

總結: