动态规划+迭代法解决力扣杨辉三角问题
-
题目:
leetCode第118题,给定一个非负整数 *
numRows
,*生成「杨辉三角」的前numRows
行。 -
找规律:
在「杨辉三角」中,每个数是它左上方和右上方的数的和,
转换成二维数组,既可以理解为:
dp[i][k] = dp[i - 1][k - 1] + dp[i - 1][k];
并且显而易见的是,当 numRows = 1的时候,杨辉三角输出为1.
此方法是典型的用空间换时间,将解决问题的时间复杂度转为了空间复杂度。所以在leetCode上提交时,是击败100%的其他人,嘿嘿
所以,我们可以根据第一行的值,推到出第2、3、4、…n行。
/**
* 杨辉三角
* 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
*
* @param numRows
* @return
*/
public List<List<Integer>> generate(int numRows) {
// 首先声明出返回结果
List<List<Integer>> res = new ArrayList<>(numRows);
// 定义出二维dp数组用以记录已经推到出的位置的数据,避免重复计算
int[][] dp = new int[numRows + 1][numRows + 1];
dp[0][0] = 1;
res.add(Arrays.asList(1));
for (int i = 1; i < numRows; i++) {
// 每一行的数据
List<Integer> list = new ArrayList<>();
// 可以理解为指向当前所在列的指针
int k = 0;
while (k <= i) {
// 每一行的第一列为1,如果直接用dp数组推导,在每一行的第一列会出现数组角标越界问题
if (k == 0) {
dp[i][k] = 1;
list.add(1);
} else {
// 运用dp数组推导数据
dp[i][k] = dp[i - 1][k - 1] + dp[i - 1][k];
list.add(dp[i][k]);
}
k++;
}
res.add(list);
}
return res;
}
有一定算法基础的同学可以看出,此题还可以用递归推导出,因为结束条件为 numRows = 1,在这里就不详细描述了,有时间再写一篇文章记录