Python 算法快闪 LeetCode 编号 70 - 爬楼梯

目录

题目描述

[【计时开始 - 15分钟】](#【计时开始 - 15分钟】)

【比赛结束】

快闪赛的亮点


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1: 输入:n = 2 输出:2 解释:有兩種方法可以爬到樓頂。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到樓頂。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示: 1 <= n <= 45


【计时开始 - 15分钟】

思考过程与执行(内部模拟):

0-2 分钟:理解题目,识别模式

  • "爬楼梯",每次 1 或 2 步。求总方法数。
  • n=1: 1 种 (1)
  • n=2: 2 种 (1+1, 2)
  • n=3: 3 种 (1+1+1, 1+2, 2+1)
  • n=4: 5 种 (1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2)
  • 这个序列:1, 2, 3, 5... 看起来像斐波那契数列!
  • 递推关系 :到达第 i 阶的方法数 F(i) = F(i-1) (从 i-1 阶爬 1 步上来) + F(i-2) (从 i-2 阶爬 2 步上来)。
  • 边界条件:F(1) = 1, F(2) = 2。

2-7 分钟:选择算法与实现

  • 递归 (Naive)

def climbStairs_recursive(n):

if n == 1: return 1

if n == 2: return 2

return climbStairs_recursive(n-1) + climbStairs_recursive(n-2)

  • 问题:重复计算严重,O(2^n) 时间复杂度,对于 n=45 会超时。
  • 递归 + 记忆化搜索 (Memoization)

memo = {}

def climbStairs_memo(n):

if n in memo: return memo[n]

if n == 1: return 1

if n == 2: return 2

result = climbStairs_memo(n-1) + climbStairs_memo(n-2)

memo[n] = result

return result

  • 复杂度:O(n) 时间,O(n) 空间。可行。
  • 动态规划 (Bottom-up)
    • 基于斐波那契数列的迭代计算。
    • 思路:从 F(1) 和 F(2) 开始,迭代计算 F(3), F(4), ..., F(n)。
    • 时间复杂度:O(n)。
    • 空间复杂度:O(n)(如果用数组存储),或者 O(1)(只存储前两项)。
    • 工程落地:O(1) 空间复杂度更优。

选择动态规划 (Bottom-up, O(1) space) 作为最终方案。

7-12 分钟:编写代码(Python)

class Solution:

def climbStairs(self, n: int) -> int:

"""

爬楼梯问题:求到达 n 阶楼顶的不同方法数。

每次可爬 1 或 2 阶。

这是一个斐波那契数列的变种问题。

F(n) = F(n-1) + F(n-2)

边界条件: F(1) = 1, F(2) = 2

"""

处理基本边界情况

if n == 1:

return 1

if n == 2:

return 2

使用动态规划,O(1) 空间复杂度

a, b 分别代表 F(i-2) 和 F(i-1)

a = 1 # 对应 F(1)

b = 2 # 对应 F(2)

从第 3 阶开始迭代计算

for i in range(3, n + 1):

当前阶数的方法数 = 前一阶 + 前两阶

current_ways = a + b

更新 a 和 b,为下一轮计算做准备

a = b # 原来的 F(i-1) 变成 F(i-2)

b = current_ways # 新计算出的 F(i) 变成 F(i-1)

return b # 最终 b 存储的就是 F(n)

12-14 分钟:简单测试与注释

  • 示例 1:n = 2
    • 代码直接返回 2。正确。
  • 示例 2:n = 3
    • a = 1, b = 2
    • i = 3: current_ways = 1 + 2 = 3. a = 2, b = 3.
    • 循环结束,返回 b (3)。正确。
  • 考虑 n=1:代码已处理。
  • 代码风格 :变量命名 a, b 稍显简略,但符合动态规划的惯例。current_ways 提升了可读性。注释解释了思路和边界条件。
  • 工程落地:代码逻辑清晰,边界条件处理到位。

14-15 分钟:最终检查

  • 代码是否满足 LeetCode 格式要求? (类 Solution,方法 climbStairs) -> 是。
  • 是否包含了思路说明? -> 是,在函数注释中。
  • 通过示例测试? -> 是。
  • 时间复杂度 O(n),空间复杂度 O(1)。符合要求。

【比赛结束】

最终提交(模拟):

解题思路: 该问题是典型的斐波那契数列变种。到达第 n 阶的方法数等于到达第 n-1 阶的方法数(再走一步)加上到达第 n-2 阶的方法数(再走两步)。定义 F(i) 为到达第 i 阶的方法数。 递推关系为:F(i) = F(i-1) + F(i-2)。 基本边界条件: F(1) = 1 (只能走 1 步) F(2) = 2 (走 1+1 或 2)

采用动态规划(迭代法)实现,使用 O(1) 的空间复杂度来存储前两项的结果,并向前迭代计算直到 n

代码:

class Solution:

def climbStairs(self, n: int) -> int:

"""

爬楼梯问题:求到达 n 阶楼顶的不同方法数。

每次可爬 1 或 2 阶。

这是一个斐波那契数列的变种问题。

F(n) = F(n-1) + F(n-2)

边界条件: F(1) = 1, F(2) = 2

"""

处理基本边界情况

if n == 1:

return 1

if n == 2:

return 2

使用动态规划,O(1) 空间复杂度

a, b 分别代表 F(i-2) 和 F(i-1)

a = 1 # 对应 F(1)

b = 2 # 对应 F(2)

从第 3 阶开始迭代计算

for i in range(3, n + 1):

当前阶数的方法数 = 前一阶 + 前两阶

current_ways = a + b

更新 a 和 b,为下一轮计算做准备

a = b # 原来的 F(i-1) 变成 F(i-2)

b = current_ways # 新计算出的 F(i) 变成 F(i-1)

return b # 最终 b 存储的就是 F(n)

快闪赛的亮点

  • 思维速度:题目模式识别(斐波那契)非常快,直接跳过了暴力递归,选择了高效的 DP 方法。
  • 工程落地
    • 选择了空间复杂度更优的 O(1) DP 实现。
    • 代码注释清晰,解释了思路、递推关系和边界条件。
    • 边界条件 n=1, n=2 处理得很直接。
    • 变量命名(a, b)虽然简洁,但注释解释了其含义,在 DP 中是常见且可接受的。
  • 时间控制:在 15 分钟内完成了从理解到编写、测试的完整流程。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
fantasy_arch1 小时前
pytorch人脸匹配模型
人工智能·pytorch·python
熊猫_豆豆1 小时前
广义相对论水星近日点进动完整详细数学推导
python·天体·广义相对论
web3.08889991 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
AI算法沐枫2 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
一只机电自动化菜鸟3 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
X1A0RAN3 小时前
解决Pycharm中部分文件或文件夹被隐藏不展示问题
ide·python·pycharm
MomentYY3 小时前
第 3 篇:让 Agent 学会分工,LangGraph 构建多 Agent系统
人工智能·python·agent
程序员Jelena3 小时前
Python 代码是什么?—— 从字节到执行的完整解析
python