Leetcode 动态规划 1

题号直达: 70 爬楼梯 | 118 杨辉三角

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²))。
posted @ 2026-10-12 00:29  Phier  阅读(2)  评论(0)    收藏  举报