Leetcode—— 181.杨辉三角II

181.杨辉三角II

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

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

示例:

输入: 3
输出: [1,3,3,1]
进阶:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路1:

用杨辉三角I中的方法

程序代码1:

class Solution:
    def getRow(self, rowIndex):
        dp = [[0] * n for n in range(1, rowIndex + 2)]
        for i in range(rowIndex+1):
            dp[i][0] = dp[i][-1] = 1
        for i in range(0, rowIndex+1):
            for j in range(i + 1):
                if dp[i][j] == 0:
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
        return dp[-1]

s = Solution()
print(s.getRow(3))

解题思路2:

比如 [1,3,3,1],它的下一行为 [1,4,6,4,1],可以先将 [1,3,3,1]前面加一个0,然后计算 [0+1,1+3,3+3,3+1,1],最后一个1不变。

1.确定状态:

  • dp[j]是指一行中的第j个数字

2.转移方程:

  • dp[j] = dp[j] + dp[j+1]

3.边界情况:

  • 初始化为1

程序代码2:

class Solution:
    def getRow(self, rowIndex):
        dp = [1]
        for i in range(1, rowIndex + 1):
            dp.insert(0, 0)
            for j in range(i):
                dp[j] = dp[j] + dp[j + 1]
        return dp

s = Solution()
print(s.getRow(4))

解题思路3:

用pre保存上一行的结果,用now计算这一行的结果,除了边界是1,中间的第 i 个数一直都是前一行第 i -1 个数加上前一行第 i 个数。

1.确定状态:

  • now[i]是指一行中的第i个数字

2.转移方程:

  • now[i] = pre[i-1] + pre[i]

3.边界情况:

  • 初始化为1

程序代码3:

class Solution:
    def getRow(self, rowIndex):
        for i in range(rowIndex+1):
            now = [1]*(i+1)
            for i in range(1,i):
                now[i] = pre[i-1] + pre[i]
            pre = now
        return now

s = Solution()
print(s.getRow(3))
发布了246 篇原创文章 · 获赞 155 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/suxiaorui/article/details/103939740