持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
118. 杨辉三角 - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负整数 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 <= 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;
}
}