杨辉三角 II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
解题思路
杨辉三角有一个特点,就是说杨辉三角两侧的边上的元素值都是 1,并且在杨辉三角中,每个数是它左上方和右上方的数的和。所以,可以将杨辉三角想象成是一个直角三角形。如下图所示:
首先,创建一个二维数组,并将该数组的第一个元素赋值为 1,然后按行遍历(有行数的限制:rowIndex),再将两条边上的元素赋值为 1。
然后,当遍历到某一行时,要依次计算该行中的每一个元素,即在杨辉三角中,每个数是它左上方和右上方的数的和。(dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j])
代码
class Solution {
//(看成是一个直角三角形)
public List<Integer> getRow(int rowIndex) {
//声明且分配内存
Integer dp[][] = new Integer[rowIndex + 1][rowIndex + 1];
dp[0][0] = 1;//第一个数为1
//因为dp[0][0]的值已经给了 所以i从1开始
for (int i=1;i<=rowIndex;i++) {
dp[i][0] = dp[i][i] = 1;
for (int j=1;j<i;j++) {
//上一行两元素相加
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
}
}
return Arrays.asList(dp[rowIndex]);
}
}
时间复杂度:因为有两个 for 循环嵌套,所以复杂度为O(rowIndex²)。