- 标签:数组、动态规划
- 难度:简单
描述:给定一个非负整数
要求:返回杨辉三角的第
说明:
-
$0 \le rowIndex \le 33$ 。 - 要求使用
$O(k)$ 的空间复杂度。
示例:
- 示例 1:
输入:rowIndex = 3
输出:[1,3,3,1]
因为这道题是从
按照行数进行阶段划分。
定义状态
根据观察,很容易得出状态转移方程为:$dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]$,此时
- 每一行第一列都为
$1$ ,即$dp[i][0] = 1$ 。 - 每一行最后一列都为
$1$ ,即$dp[i][i] = 1$ 。
根据题意和状态定义,将
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 本题从 0 行开始计算
numRows = rowIndex + 1
dp = [[0] * i for i in range(1, numRows + 1)]
for i in range(numRows):
dp[i][0] = 1
dp[i][i] = 1
for i in range(numRows):
for j in range(i):
if i != 0 and j != 0:
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
return dp[-1]
-
时间复杂度:$O(n^2)$。初始条件赋值的时间复杂度为
$O(n)$ ,两重循环遍历的时间复杂度为$O(n^2)$ ,所以总的时间复杂度为$O(n^2)$ 。 -
空间复杂度:$O(n^2)$。用到了二维数组保存状态,所以总体空间复杂度为
$O(n^2)$ 。
因为
其实我们还可以进一步进行优化,即我们只需要使用一个一维数组保存上一阶段的所有状态。
定义
这样我们就可以对这个一维数组保存的「上一阶段的所有状态值」进行逐一计算,从而获取「当前阶段的所有状态值」。
需要注意:本题在计算的时候需要从右向左依次遍历每个元素位置,这是因为如果从左向右遍历,如果当前元素
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 本题从 0 行开始计算
numRows = rowIndex + 1
dp = [1 for _ in range(numRows)]
for i in range(numRows):
for j in range(i - 1, -1, -1):
if i != 0 and j != 0:
dp[j] = dp[j - 1] + dp[j]
return dp
-
时间复杂度:$O(n^2)$。两重循环遍历的时间复杂度为
$O(n^2)$ 。 -
空间复杂度:$O(n)$。不考虑最终返回值的空间占用,则总的空间复杂度为
$O(n)$ 。