Dynamic Programming学习笔记 (25) - 杨辉三角 (力扣# 118)

195 阅读1分钟

本题出自力扣题库第118题。题面大意如下:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

杨辉三角中的数字有以下规律:

  1. 第n行的数字个数为n
  2. 对每一行来说,第一个和最后一个数字为1
  3. 从第三行开始,除了第一个和最后一个数字之外,其它的数字都等于它的左上方和右上方的两个数字之和,也就是说,第n行的第k个数字等于第n-1行的第k-1个数字和第k个数字的和。

杨辉三角前9行如下:

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

从以上规则不难看出这是一个简单的DP应用。我们只需使用第n-1行的列表就可以得到第n行的列表, Java代码如下:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();

        List<Integer> row = new ArrayList<>();
        row.add(1);
        result.add(row);

        for (int r = 1; r <numRows; r ++) {
            List<Integer> prevRow = result.get(r - 1);

            row = new ArrayList<>();
            row.add(1);
            for (int n = 1; n < r; n ++) {
                row.add(prevRow.get(n - 1) + prevRow.get(n));
            }
            row.add(1);

            result.add(row);
        }

        return result;
    }
}