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]
这样一来,我们就完美完成了题目的要求!