小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给定一个非负整数 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]
- 当集合数量为2,返回集合[1],[1,1];
2.双从循环开始进行操作,从第三行开始 (i=2),第二重循环从数组到当前行数(j=0;j≤i)
- 对数组首部和尾部进行判断(j==0 || j == i),这两个位置为1
- 除了上面的特殊情况,当前位置的数等于上一个数组的当前位置+前一个位置的和
- 将当前数组放入数组集合中,临时数组等于当前数组
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> arrayLists = new ArrayList<>();
ArrayList<Integer> integers1 = new ArrayList<>();
integers1.add(1);
arrayLists.add(integers1);
if (numRows == 1) {
return arrayLists;
}
ArrayList<Integer> integers2 = new ArrayList<>();
integers2.add(1);
integers2.add(1);
arrayLists.add(integers2);
if (numRows == 2) {
return arrayLists;
}
// 记录上一个数组
ArrayList<Integer> temp = integers2;
// 从第三个开始
for (int i =2; i < numRows; i++) {
ArrayList<Integer> integers = new ArrayList<>();
for (int j = 0; j <= i; j++) {
// 每行的第一位和最后一位都为1
if (j == 0 || j == i) {
integers.add(1);
}else {
integers.add(temp.get(j) + temp.get(j-1));
}
}
arrayLists.add(integers);
temp = integers;
}
return arrayLists;
}
}