给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
示例 3:
输入: rowIndex = 1
输出: [1,1]
提示:
- 0 <= rowIndex <= 33
进阶:
- 你可以优化你的算法到 O(rowIndex) 空间复杂度吗?
解题:
// 套用昨天的方法
func getRow(rowIndex int) []int {
ans := make([][]int, rowIndex+1)
for i := range ans {
ans[i] = make([]int, i+1)
ans[i][0], ans[i][i] = 1, 1
for j := 1; j < i; j++ {
ans[i][j] = ans[i-1][j] + ans[i-1][j-1]
}
}
return ans[rowIndex]
}
官方解答:
1.递推
func getRow(rowIndex int) []int {
C := make([][]int, rowIndex+1)
for i := range C {
C[i] = make([]int, i+1)
C[i][0], C[i][i] = 1, 1
for j := 1; j < i; j++ {
C[i][j] = C[i-1][j-1] + C[i-1][j]
}
}
return C[rowIndex]
}
优化,使用滚动数组
func getRow(rowIndex int) []int {
var pre, cur []int
for i := 0; i <= rowIndex; i++ {
cur = make([]int, i+1)
cur[0], cur[i] = 1, 1
for j := 1; j < i; j++ {
cur[j] = pre[j-1] + pre[j]
}
pre = cur
}
return pre
}
进一步优化
func getRow(rowIndex int) []int {
row := make([]int, rowIndex+1)
row[0] = 1
for i := 1; i <= rowIndex; i++ {
for j := i; j > 0; j-- {
row[j] += row[j-1]
}
}
return row
}
2.线性递归
func getRow(rowIndex int) []int {
row := make([]int, rowIndex+1)
row[0] = 1
for i := 1; i <= rowIndex; i++ {
row[i] = row[i-1] * (rowIndex - i + 1) / i
}
return row
}