You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
你正在爬楼梯,需要走n步才会到楼梯顶端
每次你只能选择走一步或者两步,请计算你有多少种不同的方法爬到楼梯顶端?
注意:n为正整数
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
动态规划的核心:最优子问题。其子问题是什么呢?假如台阶有n个,那么跨上第n个台阶的步子只有两种方法,从n-1台阶跨上去或者从n-2台阶跨上去,那么此时问题就很明朗了,f(n) = f(n-1)+f(n-2),f代表着跨上第n个台阶所有方法数。
即:
n = 1,一种
n = 2,两种
n>2时,对于每一个台阶i,要到达台阶,最后一步都有两种方法,从i-1迈一步,或从i-2迈两步。
也就是说,到达台阶 i 的方法数=到达台阶 i-1 的方法数+到达台阶 i-2 的方法数。
d(1) = 1
d(2) = 2
d(3) = d(3-1) + d(3-2)
d(4) = d(4-1) + d(4-2)
这个问题和斐波那契数列非常相似,只是初始条件有些变化。
================
n = 1:
f(n) = 1
n = 2:
f(n) = 2
n > 2:
f(n) = f(n-1)+f(n-2)
================
Solutions:
Python
#共有三种方法
#第一种递归,超时:
class Solution:
def climbStairs(self, n: int) -> int:
#time limit
if n == 1:
return 1
if n == 2:
return 2
return self.climbStairs(n-1) + self.climbStairs(n-2)
#第二种备忘录法,记住每一个子结果,空间复杂度O(n)
class Solution:
def climbStairs(self, n: int) -> int:
#O(n)空间,自底向上
if n == 1:
return 1
if n == 2:
return 2
step = [1,2]
for i in range(2,n):
step.append(step[i-1] +step[i-2])
return step[-1]
#第三种方法,自底向上,空间复杂度:常数
class Solution:
def climbStairs(self, n: int) -> int:
if n ==1:
return 1
if n == 2:
return 2
step1 = 1
step2 = 2
for i in range(2,n):
tmp = step1
step1 = step2
step2 = tmp+step2
return step2
reference: