[LeetCode]Climbing Stairs

题目描述:

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?

题目大意:

你正在爬楼梯。爬到顶部需要n步。

每一次你爬1步或者2步。爬到顶部有多少种不同的方式?

解题思路:

问题的本质是求斐波那契数列(Fibonacci Sequence)

递推式为:dp[x] = dp[x - 1] + dp[x - 2]

Python代码:

class Solution:
    # @param {integer} n
    # @return {integer}
    def climbStairs(self, n):
        dp = [0] * (n + 1)
        dp[0] = dp[1] = 1
        for x in range(2, n + 1):
            dp[x] = dp[x - 1] + dp[x - 2]
        return dp[n]

上述代码的空间复杂度可以化简为O(1):

class Solution:
    # @param {integer} n
    # @return {integer}
    def climbStairs(self, n):
        a = b = 1
        for x in range(2, n + 1):
            a, b = b, a + b
        return b

另外,也可以使用斐波那契数列的通项公式求解:

an = [ Phin - (phi)n ]/Sqrt[5].

其中,Phi=(1+Sqrt[5])/2,phi=(1-Sqrt[5])/2

Python代码:

class Solution:
    # @param {integer} n
    # @return {integer}
    def climbStairs(self, n):
        sqrt5 = math.sqrt(5)
        Phi = (1 + sqrt5) / 2
        phi = (1 - sqrt5) / 2
        return int((Phi ** (n + 1) - phi ** (n + 1)) / sqrt5)

 

本文链接:http://bookshadow.com/weblog/2015/08/23/leetcode-climbing-stairs/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码

Pingbacks已关闭。

暂无评论

张贴您的评论