Leetcode 动态规划 1
LeetCode 70. 爬楼梯 ↑
题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。有多少种不同的方法可以爬到楼顶?
测试样例
- 示例 1:
n = 2
输出:2
解释:1 + 1,或2。 - 示例 2:
n = 3
输出:3
解释:1 + 1 + 1,1 + 2,2 + 1。
提示
1 <= n <= 45
代码(Python)
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1:
return 1
if n == 2:
return 2
a, b = 1, 2
for _ in range(3, n + 1):
a, b = b, a + b
return b
思路解析
设 f(x) 表示爬到第 x 阶的方案数。最后一步只能是跨 1 阶或跨 2 阶,因此只能从 x - 1 或 x - 2 走来,互不重复且覆盖所有情况,状态转移为:
f(x) = f(x-1) + f(x-2)
边界与题意对应:n = 1 时 1 种,n = 2 时 2 种;从 3 起按上式递推即可得到 f(3)=3、f(4)=5 等。
空间优化(滚动变量)
f(x) 只依赖前两项,不必开长度 O(n) 的数组,用两个变量滚动保存「前两阶」即可:每次令 a, b = b, a + b,相当于把 (f(k-2), f(k-1)) 推进到 (f(k-1), f(k))。
- 时间复杂度:O(n)。
- 额外空间:O(1)。
LeetCode 118. 杨辉三角 ↑
题目
给定非负整数 numRows,生成「杨辉三角」的前 numRows 行。在杨辉三角中,每个数是它左上方与右上方两个数之和(首行与每行两端的 1 视为两侧有隐含的 0 亦可统一递推)。
测试样例
- 示例 1:
numRows = 5
输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] - 示例 2:
numRows = 1
输出:[[1]]
提示
1 <= numRows <= 30
代码(Python)
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
init = [1]
ans = []
ans.append(init)
for i in range(numRows - 1):
init = [0] + init + [0]
temp = []
for j in range(len(init) - 1):
temp.append(init[j] + init[j + 1])
ans.append(temp)
init = temp
return ans
思路解析
每一行由上一行递推:把上一行左右各补一个 0,再对相邻两项求和,得到下一行的每个位置。这与「第 i 行第 j 个数 = 上一行第 j-1 个数 + 上一行第 j 个数」一致;首行固定为 [1],numRows == 1 时循环不执行,直接返回 [[1]]。
- 时间复杂度:共生成约
1 + 2 + … + numRows个数,为 O(numRows²)。 - 额外空间:除答案外仅用当前行与临时数组,量级 O(numRows)(答案本身 O(numRows²))。

浙公网安备 33010602011771号