标题 | 118. 杨辉三角 |
难度 | 简单 |
天数 | 第4天,第2/2题 |
数据结构 | 数组 |
给定一个非负整数
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
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 创建需要返回的集合
//储存杨辉三角数据
List<List<Integer>> dp = new ArrayList();
- 初始化 第一个元素初始化赋值
//第一个元素
List<Integer> list0 = new ArrayList();
//第一个元素赋值
list0.add(1);
- 杨辉三角第一层初始化
//杨辉三角第一个赋值
dp.add(list0);
-
确定循环开始和结束
从
1
开始,到numRows-1
结束,因为numRows=1
代表第一层,而list是从0开始添加数据的
for(int i = 1 ; i < numRows;i++){}
- 在循环里创建一个杨辉三角第
i+1
层的集合存储数据
//当前是i + 1层的杨辉三角数组
List<Integer> listN = new ArrayList();
- 拿到第
i
层的数据用于计算当前层杨辉三角集合的值
//杨辉三角i层的数组
List<Integer> listNDown = dp.get(i-1);
- 第2层开始,n层杨辉三角第一位和最后一位都是1
//当前是i + 1层的杨辉三角数组 第一个值赋值
listN.add(1);
//..... 这里是中间的赋值
//当前是i + 1层的杨辉三角数组 最后一个值赋值
listN.add(1);
- 中间的赋值,从第
2
位开始,第i-1
位置结束
第j
位 = 上一层元素listNDown j-1 + j
位置的和
for(int j = 1 ;j < i;j++){
//当前是i + 1层的杨辉三角数组 第2...i-1个值赋值
listN.add(listNDown.get(j-1) + listNDown.get(j));
}
完整代码如下:
力扣【动态规划】专题 也有这题
class Solution {
//动态规划 第12天 1/2
public List<List<Integer>> generate(int numRows) {
//储存杨辉三角数据
List<List<Integer>> dp = new ArrayList();
//第一个元素
List<Integer> list0 = new ArrayList();
//第一个元素赋值
list0.add(1);
//杨辉三角第一个赋值
dp.add(list0);
for(int i = 1 ; i < numRows;i++){
//当前是i + 1层的杨辉三角数组
List<Integer> listN = new ArrayList();
//杨辉三角i层的数组
List<Integer> listNDown = dp.get(i-1);
//当前是i + 1层的杨辉三角数组 第一个值赋值
listN.add(1);
for(int j = 1 ;j < i;j++){
//当前是i + 1层的杨辉三角数组 第2...i-1个值赋值
listN.add(listNDown.get(j-1) + listNDown.get(j));
}
//当前是i + 1层的杨辉三角数组 最后一个值赋值
listN.add(1);
//将i+1层的数据存入杨辉三角数组dp
dp.add(listN);
}
return dp;
}
}