杨辉三角(简单难度)

简介: 杨辉三角(简单难度)

题目概述(简单难度)

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

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


示例 1:

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

示例 2:

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

附上leetcode链接:

点击此处进入leetcode


思路与代码

思路展现

题目中这个杨辉三角有那么一点别扭,我们来给出一个好识别的杨辉三角吧:

为了有助于找到隐藏的信息,先将杨辉三角按左对齐方式排列:

2.png

如果把上述杨辉三角按照行和列的形式画出来,如下所示:

2.png


我们用i表示行,j表示列:

2.png

我们可以看到每一个list的第一个和最后一个都是1,中间的某个数字等于上一行相同列中的list的数字加上一行前一列中list的数字,例如3=1+2.


代码示例

class Solution {
    public List<List<Integer>> generate(int numRows) {
        //ret代表我们的行
        List<List<Integer>> ret = new ArrayList<>();
        if (numRows <= 0) {
            return ret;
        }
        //第一行的list
        List<Integer> list = new ArrayList<>();
        //把第一行第一列的1先加进去
        list.add(1);
        //把第一行的list放到ret当中
        ret.add(list);
        //i表示行数,此时从第二行开始插入元素
        for (int i = 1; i < numRows; i++) {
            //curRow表示当前行
            List<Integer> curRow = new ArrayList<>();
            //将每一行最开始的1先添加上
            curRow.add(1);
            //j表示列数
            for (int j = 1; j < i; j++) {
                //这个for循环中就是确认当前i!=j的时候的元素
                //这个元素是由上一行的当前列的元素+上一行的当前列的前一个元素
                List<Integer> prevRow = ret.get(i - 1);
                int num = prevRow.get(j - 1) + prevRow.get(j);
                //将i!=j处的元素进行添加
                curRow.add(num);
            }
            //手动将i=j处的1添加上去,注意循环的终止条件为j<i
            curRow.add(1);
            //最后将整个一行的元素添加到我们的ret集合中
            ret.add(curRow);
        }
        return ret;
    }
}

 

代码思路是这样的:

1:首先把杨辉三角中的第一行的数字1先添加进去

2:然后从第二行开始进行for循环,杨辉三角的存储方式其实就是二维数组,所以我们第一个for循环就先遍历我们的行,从第二行开始遍历,但是第二行的下标为1.故i=1

因为杨辉三角每行的第一个和最后一个都是1,所以当遍历行的时候,我们先把1插入到每行的第一个元素处,然后再遍历我们其他列,进行我们第二个for循环

3:进入到我们第二个for循环后,因为这个循环是遍历我们的列,且第一列每次都将1添加进去了,所以j的遍历是从1开始的,最重要的点是j的循环终止条件到底是什么呢?我们可以发现是j

4:随后再将1添加到i=j处的位置,那么我们每一行的元素都算添加进去了.

5:最后将将整个一行的元素添加到我们的ret集合中,返回ret集合.


总结

考察到了对于list集合的使用,非常经典的一道题目,希望大家多加练习.



相关文章
|
9月前
|
搜索推荐 算法 程序员
第五十六练 基数排序实现
第五十六练 基数排序实现
49 4
|
9月前
|
测试技术
【一刷《剑指Offer》】面试题 9:斐波那契数列(扩展:青蛙跳台阶、矩阵覆盖)
【一刷《剑指Offer》】面试题 9:斐波那契数列(扩展:青蛙跳台阶、矩阵覆盖)
|
9月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
算法 C语言
面试 | 移位妙解递归乘法【细节决定成败】
面试 | 移位妙解递归乘法【细节决定成败】
69 0
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
92 0
|
存储 移动开发 算法
C++/PTA 关于深度优先搜索和逆序对的题应该不会很难吧这件事
背景知识 深度优先搜索与 DFS 序 深度优先搜索算法(DFS)是一种用于遍历或搜索树或图的算法。以下伪代码描述了在树 T 上进行深度优先搜索的过程
137 0
|
存储 Java C语言
备战蓝桥杯【高精度加法和高精度减法】
备战蓝桥杯【高精度加法和高精度减法】
141 0
备战蓝桥杯【高精度加法和高精度减法】
【AcWing】一道二分拓展的题(浮点数)
790. 数的三次方根 - AcWing题库
103 0
|
机器学习/深度学习 算法 索引
算法步步为营(1)-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。可以按任意顺序返回答案。
98 0