日新计划Leetcode之 118. 杨辉三角

100 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

118. 杨辉三角 - 力扣(LeetCode) (leetcode-cn.com)

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

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

image.png

示例 1:

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

示例 2:

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

提示:

1 <= numRows <= 30

二、思路分析:

这个题一开始没有注意到要返回的使列表,所以使用了二维数组,返回的时候发现不对,才使用了列表
所以在二维数组的基础上进行了修改
在创建列表的时候一直创建错误,最后看了官方的题解才知道正确的列表创建方式

当第一行或只有一行时,值为1
从第二行开始,该行的第一个元素与上一行的第一个元素相同,该行的最后一个元素与上一行的最后一个元素相同,其实也就是1
中间的元素是左上角与右上角的值的和,也就是说,第i行第j个元素的值等于第i-1行第j-1个元素+第i-1行第j个元素之和
每一行的元素都用一个列表num2来表示,一行结束后,将该小列表添加到大列表num1中

三、AC 代码:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        //创建动态二维数组,但每一行元素个数与行数相同
        int[][] num=new int[numRows][];
        List<Integer> num2=null;
        List<List<Integer>> num1=new ArrayList<List<Integer>>();
        for(int i=0;i<numRows;i++)
        {
            num[i]=new int[i+1];
            num2=new ArrayList<Integer>();
            //如果i=0,num[0][0]=1
            if(i==0)
            {
                num[i][0]=1;
                num2.add(num[i][0]);
            }
            //如果i!=0,num[i][0]=num[i-1][0],num[i][i]=num[i-1][i-1],num[i][j]=num[i-1][j-1]+num[i-1][j]
            else
            {
                for(int j=0;j<=i;j++)
                {
                    if(j==0)
                    {
                        num[i][j]=num[i-1][j];
                    }
                    else if(j==i)
                    {
                        num[i][j]=num[i-1][j-1];
                    }
                    else
                    {
                        num[i][j]=num[i-1][j-1]+num[i-1][j];
                    }
                    num2.add(num[i][j]);
                }
            }
            num1.add(num2);
        }
        return num1;
    }
}