【LeetCode】#119. 杨辉三角 II

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

 

示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]

示例 2:

输入: rowIndex = 0
输出: [1]

示例 3:

输入: rowIndex = 1
输出: [1,1]
方法一:数学
但与上一题不同的是,不用求出所有行只需给出特定的一行。那么这里用pre代替上一行,减少内存消耗。
class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> pre = new ArrayList<Integer>(); for(int i = 0; i <= rowIndex ; i++){ List<Integer> a = new ArrayList<Integer>(); for(int j = 0; j <= i; j++){ if(j == i || j == 0){ a.add(1); }else{ a.add(pre.get(j) + pre.get(j - 1)); } } pre = a; } return pre; } }


能否只用一个数组呢?

递推式表明,当前行第 ii 项的计算只与上一行第 i-1i−1 项及第 ii 项有关。因此我们可以倒着计算当前行,这样计算到第 ii 项时,第 i-1i−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;
    }
}
方法二:线性递推
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((int) ((long) row.get(i - 1) * (rowIndex - i + 1) / i));
        }
        return row;
    }
}

知识点:

当动态规划的题目时,只需保存上一状态可以减少内存占用。

总结:

数学没学好。

 

posted @ 2021-09-25 09:09  Canyooo  阅读(39)  评论(0)    收藏  举报