目录
题目链接:LeetCode118.杨辉三角
一.题目要求
给定一个非负整数
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,1],这是两起始行,后面的行才出现有前一行元素相加的规律,所以我们可以事先规定好,然后从第三行开始根据规律利用循环来写。
在思考第三行往后的规律时,要注意每一行的第一个和最后一个元素都是1,可以直接添加,只需要求得每一行的第二个元素到倒数第二个元素即可;要注意元素和行的下标关系,顺序表就像数组一样,每个元素也是从0开始存储的,这些一般都体现在这段代码的元素下标中。
三.具体代码
class Solution {
public List<List<Integer>> generate(int numRows) {
//定义一个顺序表,其中元素也为顺序表
//外部顺序表代表了整个杨辉三角的图,内部的每个顺序表元素对应了杨辉三角的每一行
List<List<Integer>> ans=new ArrayList<>();
//当输入行数为0时
if(numRows==0){
return ans;
}
//输入行数>0,手动添加第一行元素,并且在第一行中添加一个元素[1]
ans.add(new ArrayList<>());
ans.get(0).add(1);
//当输入行数为1时
if(numRows==1){
return ans;
}
//输入行数>1,手动添加第二行元素,并且在第二行中添加两个元素[1,1]
ans.add(new ArrayList<>());
ans.get(1).add(1);
ans.get(1).add(1);
//当输入行数为2时
if(numRows==2){
return ans;
}
//当输入行数>=3时,求普遍情况
for(int i=3;i<=numRows;i++){
//添加新的一行cur
List<Integer> cur=new ArrayList<>();
ans.add(cur);
//这一行的第一个元素一定是1,直接添加
cur.add(1);
//从这一行的第2个元素(下标为1)开始,到倒数第2个元素结束
for(int j=1;j<i-1;j++){
//记录前一行(i-2)的前一个下标(j-1)和后一个下标(j)的值
//例如:这一行为3(第3行),i=3,但在顺序表中下标是2,那么前一行(也就是第二行)的下标为1(也就是i-2)
int first=ans.get(i-2).get(j-1);
int second=ans.get(i-2).get(j);
//该元素等于上一行这两个元素相加
int e=first+second;
cur.add(e);
}
//添加最后一个元素,也一定是1
cur.add(1);
}
//返回整个杨辉三角顺序表
return ans;
}
}
四.运行截图
如想了解顺序表(ArrayList)的相关知识,请查阅:
ArrayList(顺序表)的介绍及自我实现(包括ArrayList如何扩容)
如有建议或想法,欢迎一起讨论学习~