假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
直接递归法
class Solution:
@functools.lru_cache(100) # 缓存装饰器
def climbStairs(self, n: int) -> int:
if n == 1: return 1
if n == 2: return 2
return self.climbStairs(n-1) + self.climbStairs(n-2)
直接DP
class Solution:
def climbStairs(self, n: int) -> int:
dp = {}
dp[1] = 1
dp[2] = 2
for i in range(3,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
DP
class Solution:
def climbStairs(self, n: int) -> int:
if n==1 or n==2: return n
a, b, temp = 1, 2, 0
for i in range(3,n+1):
temp = a + b
a = b
b = temp
return temp
斐波那契数列
class Solution:
def climbStairs(self, n: int) -> int:
import math
sqrt5=5**0.5
fibin=math.pow((1+sqrt5)/2,n+1)-math.pow((1-sqrt5)/2,n+1)
return int(fibin/sqrt5)
面向测试用例编程
class Solution:
def climbStairs(self, n: int) -> int:
a = [1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903]
return a[n-1]
动态规划法
class Solution:
def climbStairs(self, n: int) -> int:
"""
爬到第n楼的方法,为爬到第n-1楼和n-2楼的方法之和
因为爬到n-1楼后,再爬1楼就能到达n楼
爬到n-2楼同理
因此只需初始化爬到1楼和爬到2楼分别有多少种方法,便可以推导出爬到n楼的方法
"""
fst = 1 # 爬到1楼只有1种方法
scd = 2 # 爬到2楼有两种方法
res = 0 # 初始化爬到n楼的方法
for i in range(2, n): # 从3楼开始算
res = fst + scd
fst = scd # 推导下一层
scd = res
return max(n, res) # 返回n和res中较大的那个
来源:力扣(LeetCode)