leetcode.70.Climbing Stairs

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(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值