「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。
题目描述:
119. 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex **行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
示例 3:
输入: rowIndex = 1
输出: [1,1]
提示:
0 <= rowIndex <= 33
进阶:
你可以优化你的算法到 空间复杂度吗?
思路分析
递推
思路还是和 LeetCode.118 杨辉三角一样的
我们先了解清除杨辉三角的规律
杨辉三角具有以下性质:
- 每行数字左右对称,第一位和最后一位都是1,中间是逐渐变大,然后再逐渐变小到1。
- 每个数字等于上一行的左右两个数字之和(上面动图很简单就看出来了)
当我们知晓这两个性质之后,我们就已经弄清楚了杨辉三角的规律了。
因为我们就可以一层一层的递推杨辉三角的每一层了。
优化方案
由于我们每一行的值只和上一行的值有关,那么我们其实一个数组就够了,不停的去滚动这个数组,没必要每一行都算出来了。
AC代码
class Solution {
fun getRow(rowIndex: Int): List<Int> {
var dp = Array<Int>(rowIndex+1){0}
dp[0] = 1
for(i in 1..rowIndex){
for(j in i.downTo(1)){
dp[j] += dp[j-1]
}
}
return dp.toList()
}
}
总结
这一题和之前的 LeetCode.118 杨辉三角差不多,这一天解法也不是很难,但是要想持续优化的话还有很多进步的空间。