LeetCode.119 杨辉三角 II

266 阅读1分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。

题目描述:

119. 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex **行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

1626927345-DZmfxB-PascalTriangleAnimated2.gif

示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]

示例 2:

输入: rowIndex = 0
输出: [1]

示例 3:

输入: rowIndex = 1
输出: [1,1]

提示:

  • 0 <= rowIndex <= 33

进阶:

你可以优化你的算法到 O(rowIndex)`O(rowIndex)` 空间复杂度吗?

思路分析

递推

思路还是和 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 杨辉三角差不多,这一天解法也不是很难,但是要想持续优化的话还有很多进步的空间。

参考

杨辉三角 II - 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)

杨辉三角优化 - 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)