力扣第119题-杨辉三角 II

655 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

力扣第119题 杨辉三角 II 如下所示:

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

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

示例 1:

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

示例 2:

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

一、思路

这一题与前面一题非常类似,唯一的不同就是只需要获取第 rowIndex 行的数据即可。其实是可以直接使用前面一题的思路,先将整个 杨辉三角 构造出来,然后再返回最后一行的数据即可。

但是既然是进阶题目,我们就得按照他的进阶要求来。进阶的要求如下:

image.png

题目要求我们只能只用额外的 O(rowIndex) 空间,显然用二维数组来存储整个 杨辉三角 的元素是行不通的。

我们不妨观察以下相邻的两行间有什么规律呢?

image.png

我们发现当前行的结果仅与前面一行的结果相关联,且每一行的第一个元素和最后一个元素都为 1。那么怎么样才能只使用 O(rowIndex) 空间来实现呢?

既然 arr[i][j] = arr[i-1][j] + arr[i-1][j-1]arr[i][j] 不为外层元素),说明当前元素的值只与前面一行的第 ii-1 个元素有关。

那么我们不妨使用一维数组 arr[] 来存储前面一行元素的值,则会有arr[i] = arr[i] + arr[i-1](因为 arr[i] 中存储的是上一行的第 i 个元素

既然思路有了,那么实现起来也就不难了。

二、实现

实现代码

由于第一列一定为 1 我们可以在初始的时候就像数组中添加 1。如当前元素为最后一个元素,我们也需要向数组中添加 1,因为在计算下一行结果的时候需要用到。

    public List<Integer> getRow(int rowIndex) {
        List<Integer> ret = new ArrayList<>();
        ret.add(1); // 初始化第一列
        for (int i=0; i<rowIndex+1; i++){
            for (int j=i; j>0; j--){
                if (j==i){  // 当前行最后一个元素
                    ret.add(1);
                } else {    // 非边缘元素
                    ret.set(j, ret.get(j) + ret.get(j-1));
                }
            }
        }
        return ret;
    }

测试代码

    public static void main(String[] args) {
        List<Integer> list = new Number119().getRow(4);
        System.out.println(list.size());
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~