杨辉三角(简单难度)

题目概述(简单难度)

给定一个非负整数 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

思路与代码

思路展现

题目中这个杨辉三角有那么一点别扭,我们来给出一个好识别的杨辉三角吧:
为了有助于找到隐藏的信息,先将杨辉三角按左对齐方式排列:
在这里插入图片描述
如果把上述杨辉三角按照行和列的形式画出来,如下所示:
在这里插入图片描述

我们用i表示行,j表示列:
在这里插入图片描述
我们可以看到每一个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<i,也就是说当j!=i的时候数字都不等于1,这些数字都是由上一行的当前列加上一行的当前列的前一列构成的,所以此处我们首先需要获得上一行的所有元素,使用ret.get(i-1)来获取,因为ret表示的就是行,他也是一个list集合.获取到后再使用get方法获取到两个元素并相加.
4:随后再将1添加到i=j处的位置,那么我们每一行的元素都算添加进去了.
5:最后将将整个一行的元素添加到我们的ret集合中,返回ret集合.

总结

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

Guess you like

Origin blog.csdn.net/qq_41972686/article/details/120434128