力扣第118题-杨辉三角

115 阅读2分钟

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

前言

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

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

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

示例 1:

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

示例 2:

输入: numRows = 1
输出: [[1]]

一、思路

题目意思很明确,就是根据所定的行数,来构造出杨辉三角

杨辉三角 最早实在 《九章算术》 一书中由中国南宋数学家杨辉提出,它具有许多数学特性。例如:最外层的数字始终是 1第二层是自然数列第三层是三角数列三角数列相邻数字相加可得方数数列等。

但由于我们这里只需要构造这个 杨辉三角,所以只需要用到 最外层的数字始终是 1 这个特性。此外,我们发现 杨辉三角 的第 i 行的元素个数为 i+1

经上面的总结,我们就可以构造出这个 杨辉三角 了。大致的步骤为:使用双层 for 循环,外层的 for 循环用于构造第 i 行,内层的 for 循环用于构造第 i 行的第 j 个元素。(构造时如发现当前的元素是最外层元素,则赋值为 1 即可)

二、实现

实现代码

实现的代码与思路中保持一直,需注意数组的下标起始为 0,即 arr[0][0] 表示第一行的第一个元素。

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        for (int i=0; i<numRows; i++){
            List<Integer> temp = new ArrayList<>();
            for (int j=0; j<i+1; j++){
                if (j == 0 || j==i){  // 边缘元素
                    temp.add(1);
                } else {    // 非边缘元素
                    temp.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
                }
            }
            ret.add(temp);
        }
        return ret;
    }

测试代码

    public static void main(String[] args) {
        new Number118().generate(5);
    }

结果

image.png

三、总结

碰到这种简单题我们直接重拳出击即可,我一开始还想使用递归来解决这一题,仔细一想后发现根本没有必要使用递归来实现。

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

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