Description
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.
sln1
首先我们将 n∈{1,2,3,4,5} 这几步的结果列出来观察一下:
F(1) = 1
F(2) = 2
F(3) = 3
F(4) = 5
F(5) = 8
因为每次前进的楼梯数只能等于1或者2,所以我们到达第k个楼梯之前所处的楼梯只可能是k-1或k-2。因此,到底第k个楼梯的方法,等于到达第k-1个楼梯的方法加上到达k-1个楼梯的方法,即
F(k)=F(k−1)+F(k−2)
且当k等于1的时候,F(1) = 1,k=2时,F(2) = 2,这个是初始条件。这么看来,到达每一层楼梯的方法数组成的数列,其实就是一个斐波那契数列,因此我们可以用求斐波那契数列的方法来求F(n)。python实现如下:
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
ways = [1, 2]
for i in xrange(2, n):
ways.append(ways[i - 1] + ways[i - 2])
return ways[n - 1]
sln2
既然我们在sln1中已经发现,到达每一层楼梯的方法数组成的数列其实就是一个斐波那契数列,那么我们自然就可以用fibonacci数列公式来直接求F(n)。fibonacci数列公式参考维基百科。依旧观察sln1中我们列出的F(1)~F(5),将其与标准fibonacci数列对比,不难发现F(n) = fibonacci(n + 1)。因此在利用公式计算F(n)时,记得要对n做出相应调整(n=n+1)。
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
theta = (1.0 + pow(5, 0.5)) / 2
n = n + 1
return int((pow(theta, n) - pow(-theta, -n)) / pow(5, 0.5))