假设爬n个台阶有f(n)种方法,那么爬过第一个步之后就有两种可能:
- 第一次爬一个台阶,那么后面的会有f(n-1)种方法
- 第一次爬两个台阶,后面就会有f(n-2)种方法
这样的话,f(n) = f(n-1)+f(n-2)
方法一:递归,开销较大,不适用
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n==2:
return 2
else:
return self.climbStairs(n-1) + self.climbStairs(n-2)
方法二:动态规划
每次向后移动时,记录之前所走的两步时到底有多少种方法,进而退出当前所属的位置到达终点有多少种方法,不断向后推,直至终点
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
if n==2:
return 2
before_one_step = 2
before_two_step = 1
current_step = 0
for i in range(3, n+1):
current_step = before_one_step + before_two_step
before_two_step = before_one_step
before_one_step = current_step
return current_step
这里还有一版贼短的代码:
def climbStairs(self, n):
a = b = 1
for _ in range(n):
a, b = b, a + b
return a