【leetcode】Python实现-70.爬楼梯

70.爬楼梯

描述

假设你正在爬楼梯。需要 n 步你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例1

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 步 + 1 步
2. 2 步

示例2

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 步 + 1 步 + 1 步
2. 1 步 + 2 步
3. 2 步 + 1 步

我第一反应是用递归实现,然而不出所料超出时间限制。

        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            s1 = self.climbStairs(n-1)
            s2 = self.climbStairs(n-2)
            return s1+s2 

所以。。。。再想一想。既然递归不行就递推试试。emmm…网上说这个问题的结果和Fibonacci数列一样。果然是这样。。。尽管可以转换为求解fibonacci,但是还是应该好好思考一下怎么解决原问题。毕竟可能会联想不到fibonacci。

        nums = [0,1,2]
        if n == 1:
            return nums[1]
        elif n == 2:
            return nums[2]
        else:
            for i in range(3,n+1):
                nums.append(nums[i-1] + nums[i-2])
        return nums[n]

上面这个版本通过了,但是只战胜了25%的人,寻求更优的算法吧。
这个很机智啊,我的列表初始化可以优化成如下:

        condition = [0] * (n + 1)
        condition[0] = 1
        condition[1] = 1
        for i in range(2, n+1):
            condition[i] = condition[i-1] + condition[i-2]
        return condition[n]

关于循环和递归:
Loops may achieve a performance gain for your program. Recursion may achieve a performance gain for your programmer. Choose which is more important in your situation!
如果使用循环,程序的性能会更高。如果使用递归,程序更容易理解。

猜你喜欢

转载自blog.csdn.net/qq_34364995/article/details/80284361