一、题目介绍
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和
来源:力扣(leetcode)
链接: pascals-triangle.
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
1、将杨辉三角形先变成我们熟悉的样子
根据上图找规律:
① 每行第一个与最后一个均为1
②每行除第一个与最后一个,其余均为上一行对应的两个数的和
③将上一行数暂存在一个List中,一遍下一行调用
代码如下(示例):
class Solution {
//找规律:
//1、每一行第一个与最后一个均为1
//2、每行除第一个和最后一个,其余均为上一行对应的两个数之和
//3、将上一行数暂存在一个list中,以便下一行调用
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> l = new ArrayList<>();
//每行的列数与第几行相同,可以写出框架,(i为行数,j为列数[即为每一行的个数])
for(int i = 0; i< numRows;i++){
//这里的li代表每一行
List<Integer> li = new ArrayList<>();
for(int j = 0;j <= i; j++){
//每行第一个数与最后一个数都是1,其余数为上行对应两个数之和
if(j==0 || j == i){
li.add(1);
}else{
//list.get(i) 返回list的第i+1个数据
li.add(l.get(j-1) + l.get(j));
}
}
//将本行数据赋值给总得l
l = li;
list.add(li);
}
return list;
}
}
2、仔细观察上面的代码,还有可以优化的地方,如下:
① 没有必要再生成一个l
class Solution {
//找规律:
//1、每一行第一个与最后一个均为1
//2、每行除第一个和最后一个,其余均为上一行对应的两个数之和
//3、将上一行数暂存在一个list中,以便下一行调用
public List<List<Integer>> generate(int numRows) {
//定义返回结果
List<List<Integer>> list = new ArrayList<>();
//每行的列数与第几行相同,可以写出框架,(i为行数,j为列数[即为每一行的个数])
//控制层数
for(Integer i = 1; i<=numRows;i++){
//这里的li代表每一行
List<Integer> li = new ArrayList<>();
for(Integer j = 1;j <= i; j++){
//每行第一个数与最后一个数都是1,其余数为上行对应两个数之和
if(j==1 || j.equals(i)){
li.add(1);
}else{
//list.get(i) 返回list的第i+1个数据
//比较上一步l,可以从list里面取,而不需要再定义一个单独的变量
//li.add(l.get(j-2) + l.get(j-1));
//取出上一层数据并计算
li.add(list.get(i-1).get(j-1) + list.get(i-1).get(j-1));
}
}
list.add(li);
}
return list;
}
}
3、参考链接
参考链接.