携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目
给定一个非负整数 *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],然后生成第二行时我们给第一行左右处额外添加两个 0 值,得到 [0,1,0],
此时该数组第一项+第二项=0+1=1作为第二行的第一个元素,第二项+第三项作为第二个元素,此时第三项是 [0,1,0] 数组的最后一个元素
所以我们已经完成了第二行的布置,也就是 [1,1]
生成第三行同理,额外添 0 得 [0,1,1,0],然后重复当两两相加得一个元素,直至所有元素被利用完。
同时我们可以发现每行的元素数量等于该行的行数
所以我们要做的就是根据题传行数,生成各行的数组,每生成完一行数组,就将其添加到结果数组中。
代码
class Solution {
public static List<List<Integer>> generate(int numRows) {
List<List<Integer>> nums = new ArrayList<List<Integer>>();
List<Integer> pre = new ArrayList<Integer>();
int in = 0;
pre.add(1);
nums.add(pre);
for(int i = 1; i<numRows; i++){
List<Integer> now = new ArrayList<Integer>();
for(int j = 0; j<=i;j++){
if(j == 0 || j == i){
in = pre.get(0);
}else{
in = pre.get(j-1) + pre.get(j);
}
now.add(in);
}
nums.add(now);
pre.add(0);
Collections.copy(pre, now);
}
return nums;
}
}
结语
业精于勤,荒于嬉;行成于思,毁于随。