侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【动态规划】杨辉三角 II

GabrielxD
2022-04-17 / 0 评论 / 0 点赞 / 127 阅读 / 534 字
温馨提示:
本文最后更新于 2022-07-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
## 题目

119. 杨辉三角 II


给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。

sp20220416_215135_948.gif (260×240) (gabrielxd.top)

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= rowIndex <= 33

解题

方法一:递推

思路

杨辉三角中每行第一个元素与最后一个元素固定是 1 ,其他元素是其 左上元素 + 右上元素。初始化第一行只有一个元素 1 其它行依次计算即可,推出到对应行的整个杨辉三角返回最后一行即可。

代码

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<List<Integer>> triangleList = new ArrayList<>();
        List<Integer> firstRow = new ArrayList<>();
        firstRow.add(1);
        triangleList.add(firstRow);

        for (int i = 1; i <= rowIndex; i++) {
            List<Integer> row = new ArrayList<>();
            row.add(1);
            triangleList.add(row);
            for (int j = 1; j < i; j++) {
                List<Integer> prevRow = triangleList.get(i - 1);
                row.add(prevRow.get(j - 1) + prevRow.get(j));
            }
            row.add(1);
        }

        return triangleList.get(rowIndex);
    }
}
优化:滚动数组

不同于 118. 杨辉三角 ,这个题只需要返回对应单行的杨辉三角即可,可以使用滚动数组进行空间优化。

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

        return prevRow;
    }
}
优化:单数组

由于当前行中元素 j 是由上一行的 j - 1 元素与 j 元素加和计算出来的,故倒序计算当前行即不会覆盖所需的上一行数据。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> row = new ArrayList<>();
        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 - 1) + row.get(j));
            }
        }

        return row;
    }
}
0

评论区