leetcode.70.Climbing Stairs

来源:互联网 发布:老虎机算法作弊器 编辑:程序博客网 时间:2024/04/30 03:08

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) = 1F(2) = 2F(3) = 3F(4) = 5F(5) = 8

因为每次前进的楼梯数只能等于1或者2,所以我们到达第k个楼梯之前所处的楼梯只可能是k-1或k-2。因此,到底第k个楼梯的方法,等于到达第k-1个楼梯的方法加上到达k-1个楼梯的方法,即

F(k)=F(k1)+F(k2)

且当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))
0 0
原创粉丝点击