LeetCode——0118.杨辉三角 & 0119.杨辉三角II

118.杨辉三角 & 119.杨辉三角II

题目

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。



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

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。



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

示例:

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

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

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

题解思路

1>源代码

# 杨辉三角
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        yanghui = []
        for i in range(numRows):
            yanghui.append([1]*(i+1))
        for i in range(numRows):
            if(i > 1):
                for j in range(1, len(yanghui[i])-1):
                    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]
        return yanghui

# 杨辉三角II
class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        numRows = rowIndex+1
        yanghui = []
        for i in range(numRows):
            yanghui.append([1]*(i+1))
        for i in range(numRows):
            if(i > 1):
                for j in range(1, len(yanghui[i])-1):
                    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]
        return yanghui[rowIndex]

2>算法介绍

这两道题属于一个系列的题目,核心就是杨辉三角的构造。118题要求输出杨辉三角的前n层,直接通过循环构造整个杨辉三角即可。119题只要求输出杨辉三角的某一行,当然我们也可以和118题一样构造整个杨辉三角,但题目希望我们能将算法的空间复杂度优化为 O(k) ,于是我们设计如下算法:

# O(k) 空间复杂度
class Solution2:
    def getRow(self, rowIndex: int) -> List[int]:
        yanghui = [1]
        for i in range(1, rowIndex + 1):
            yanghui.append(0)
            for j in range(1, i + 1):
                yanghui[-j] = yanghui[-j] + yanghui[-j - 1]
        return yanghui

我们首先观察其中一行的构造方法 [1, 3, 3, 1] = [1, 2, 1, 0] + [0, 1, 2, 1],这个我相信大家都能观察出来,但主要问题是,在计算这一行之前我们的列表是[1, 2, 1],要怎么得到[1, 2, 1, 0], [0, 1, 2, 1]这两个列表呢?

如果你再申请一个临时列表,那也许并不满足空间复杂度为O(k)这个要求,于是我们继续观察这两个列表,发现其实我们只需要一个列表就够了,因为另一个列表就是它的倒序。于是我们有了如下代码:

            yanghui.append(0)
            for j in range(1, i + 1):
                yanghui[-j] = yanghui[-j] + yanghui[-j - 1]

这样一来,我们就完美完成了题目的要求!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值