118. 杨辉三角_难度简单_动态规划

118. 杨辉三角

难度简单

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

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

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

通过次数92,938提交次数138,997


解法1:

class Solution {
    /*
     * 帕斯卡三角形
     *  1
     *  1 1
     *  1 2 1
     *  1 3 3 1
     *  1 4 6 4 1
     *  1 5 10 10 5 1
     */
    public List> generate(int n) {
        // 首列 和 最后一列 固定是 1
        // 即col == 0 或 col == row时

        // 其他情况时
        // arr[row][col] = arr[row - 1][col - 1] + arr[row - 1][col]

        List> resultArr = new ArrayList<>();
        // 备忘录,二维数组,中间变量: 记录计算过的结果
        int[][] dpArr = new int[n][n];

        for (int row = 0; row < n; row++) {
            // 保存每一行
            List subArr = new ArrayList<>();

            // 核心代码: col <= row
            for (int col = 0; col <= row; col++) {
                if (col == 0 || col == row) {
                    dpArr[row][col] = 1;
                } else {
                    // 核心代码: 状态转移方程
                    dpArr[row][col] = dpArr[row - 1][col - 1] + dpArr[row - 1][col];
                }
                subArr.add(dpArr[row][col]);
            }
            resultArr.add(subArr);
        }
        return resultArr;
    }
}

 

119. 杨辉三角 II

难度简单

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 行。

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

示例:

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

进阶:

你可以优化你的算法到 O(k) 空间复杂度吗?

解法1:

class Solution {
    /*
     * 帕斯卡三角形
     *  1
     *  1 1
     *  1 2 1
     *  1 3 3 1
     *  1 4 6 4 1
     *  1 5 10 10 5 1
     */
    public List getRow(int rowIndex) {
        // 首列 和 最后一列 固定是 1
        // 即col == 0 或 col == row时

        // 其他情况时
        // arr[row][col] = arr[row - 1][col - 1] + arr[row - 1][col]        

        // 备忘录,二维数组,中间变量: 记录计算过的结果
        // 输入: 3
        // 输出: [1,3,3,1]
        int[][] dpArr = new int[rowIndex + 1][rowIndex + 1];

        // 保存rowIndex那一行的所有数字
        List resultArr = new ArrayList<>();

        for (int row = 0; row <= rowIndex; row++) {            
            // 核心代码: col <= row
            for (int col = 0; col <= row; col++) {
                if (col == 0 || col == row) {
                    dpArr[row][col] = 1;
                } else {
                    // 核心代码: 状态转移方程
                    dpArr[row][col] = dpArr[row - 1][col - 1] + dpArr[row - 1][col];
                }

                if (row == rowIndex) {
                    // 题目只要第rowIndex行的数据
                    resultArr.add(dpArr[row][col]);
                }                
            }
        }
        return resultArr;
    }
}

 

你可能感兴趣的:(力扣刷题)