题目:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
解法1:
我们用 f(x) 表示爬到第 x级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:
f(x) = f(x-1) + f(x-2)
首先要找到边界情况,即f(1)代表1级台阶,这时候就只有1这个策略,f(2)代表2级台阶,这时候只有(1,1)和2这两个策略,所以f(1)=1,f(2)=2,又因为每次只能爬1个或2个台阶,所以爬n级台阶时的最后一步只有两种情况,就是爬1个台阶,或者爬2个台阶,所以可以化简成爬n个台阶的可能情况数,就等于爬n-1个台阶的可能情况数与爬n-2个台阶数之和。
class Solution:
def climbStairs(self, n: int) -> int:
i,j = 1,2 #这是1个台阶和2个台阶时的情况,显然1个台阶时,只有一个策略就是1,2个台阶时有(1,1)和2这两种策略,这是边界情况,作为初始化的值
for _ in range(n-1): #接下来遍历0到n-2
i,j = j,i+j #_为0时,i=j和j=i+j就是2个台阶和3个台阶时的情况了,以此类推,_为n-2时,i就是n-2+2=n个台阶时的情况了
return i #返回n个台阶时的可能情况数即可
解法2:
根据递推方程f(n)=f(n−1)+f(n−2),我们可以写出这样的特征方程:
其中,设通解为,代入初始条件,f(1)=1,f(2)=2,得,可以得到递推式为 。
class Solution:
def climbStairs(self, n: int) -> int:
sqrt5 = sqrt(5) #直接按照公式来编写代码,先算出根号5
fibn = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1) #然后代入公式
return round(fibn / sqrt5) #最后再除以根号5