1、题目描述
给定一个非负整数 *numRows
,*生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。l
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
2、分析
由题可得如下规律:
1、一行第一个数为1;
2、每行个数等于其行数;
3、行数为上一行前一列数与上一行本列数相加
如以二维数组看可得公式:i为行 j为列
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]
4、行的第一个和最后一个数都是1,即当 j == i 或者 j==0
按动态规划解题思路如下:
- 定义状态: 设
dp
为二维数组,其中dp[i][j]
表示杨辉三角的第i
行第j
个元素的值。 - 初始化: 将第一列和每一行的第一个元素初始化为
1
。 - 状态转移: 对于
dp[i][j]
,它等于上一行的dp[i-1][j-1]
和dp[i-1][j]
的和。 - 边界处理: 第
i
行有i+1
个元素,所以在每一行i
之前的元素,即dp[i][j]
中的j
取值范围是[0, i]
。 - 返回结果: 返回整个二维数组
dp
。
3、解题代码
Java
class Solution {
public List<List<Integer>> generate(int numRows) {
//创建嵌套列表,外层为list
List<List<Integer>> list = new ArrayList<>();
//循环遍历外层列表,即层数i
for (int i = 0; i < numRows; i++) {
//创建嵌套列表,内层为list1
List<Integer> list1 = new ArrayList<>();
//循环遍历外层列表并添加元素,即层数j
for (int j = 0; j <= i; j++) {
//每行的第一个和最后一个数都是1
if (j == 0 || i == j) {
list1.add(1);
} else {
// 否则本列表数为上一列表前一个数与上一列表本列数相加
list1.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
}
}
// 将内层列表添加进外层列表
list.add(list1);
}
return list;
}
}
C++
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> dp(numRows); //二维动态数组
for(int i = 0;i < numRows;i++){
dp[i].resize(i + 1);
dp[i][0] = dp[i][i] = 1;
for (int j = 1; j < i; ++j) {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
}
}
return dp;
}
};