Leecode 杨辉三角
Day 7 刷题
我的解题思路:按照杨辉三角的生成原理,行列交替循环。本方法消耗的空间复杂度和时间复杂度都很大,因为使用list操作获取上一层信息!此外需要学习建立list层的方法:list.add(new LinkedList<>())
.
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>();
// 添加层数
list.add(new LinkedList<>());
list.get(0).add(1);
for(int i=1; i<numRows;i++){
list.add(new LinkedList<>());
List<Integer> dp = new ArrayList<Integer> ();
dp.add(1);
for(int j = 1;j<i;j++){
dp.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
}
dp.add(1);
list.get(i).addAll(dp);
}
return list;
}
}
阿白想进大厂的动态规划解题思路:
定义状态dp[i][j]为杨辉三角中第i行第j列(行列索引从0开始)的元素值。状态转移方程为:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j],其中 dp[i-1][j-1]和dp[i- 1][j]是当前元素左上方和上方的元素值。 需要注意的是,每一行的第一个元素和最后一个元素都是1,即当j=0或j=i 时,dp[i][j] = 1。
Hardcore EinsteinSGt的代码
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
int[][] dp = new int[numRows][numRows];
dp[0][0] = 1;
result.add(new ArrayList<Integer>(){{ add(dp[0][0]);}});
if (numRows == 1) {
return result;
}
for (int i = 1; i < numRows; i++) {
List<Integer> num = new ArrayList<>();
dp[i][0] = 1;
num.add(dp[i][0]);
for (int j = 1; j < i; j++) {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
num.add(dp[i][j]);
}
dp[i][i] = 1;
num.add(dp[i][i]);
result.add(num);
}
return result;
}