杨辉三角(简单难度)

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

题目概述(简单难度)

给定一个非负整数 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集合的使用,非常经典的一道题目,希望大家多加练习.



相关文章
|
4月前
|
存储
初阶编程题积累(3)——最接近的三数之和(题目描述、示例、题目思路、题解、解析)
初阶编程题积累(3)——最接近的三数之和(题目描述、示例、题目思路、题解、解析)
29 0
|
5月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
存储 算法 vr&ar
算法步步为营(02)-两数之和
两个非空链表,表示两个非负整数。它们每位数字都是逆序存储,且每个节点只能存储一位数字。 将两个数相加,并以相同形式返回一个表示和的链表。除了数字 0 之外,这两个数都不会以 0 开头。
97 0
|
机器学习/深度学习 算法 索引
算法步步为营(1)-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。可以按任意顺序返回答案。
80 0
|
算法 JavaScript 前端开发
日拱算法:解两道“杨辉三角”题
什么是“杨辉三角”,想必大家并不陌生~~ 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
|
人工智能 算法 C++
[**算法**]关于数字反转的两道例题的分析思考
两个题目看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)还有一个是去处理整数
140 0
|
算法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
126 0
【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法
|
存储 算法
全排列(中等难度)
全排列(中等难度)
73 0
全排列(中等难度)
|
算法 Java Python
左旋转字符串(简单难度)
左旋转字符串(简单难度)
57 0
左旋转字符串(简单难度)
斐波那契数列(简单难度)
斐波那契数列(简单难度)
144 0
斐波那契数列(简单难度)