Leetcode 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 阶

该题一开始以为是动态规划,后来调试自己的程序,这题目不是单纯的动态规划,因为先走1阶的楼梯再走2阶楼梯,和先走2阶楼梯再走1阶楼梯,这两种走法是不同的方法.但是在动态规划没有这类问题的区分.实际上,对于爬楼梯的方法数进行计算和列表后,发现其实就是Fibonacci 序列,剩下的就是比较简单的实现了

此题目看出分析题目和理解很重要!!!!!!

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        
        a = [1, 2]
        for i in range(0, 100):
            temp = a[i+1] + a[i]
            a.append(temp)
        return a[n-1]
               

二刷准备用递归和动态规划来做的,再次遇到这道题目还是没有想起斐波那契数列,不过想起某公司面试的惨痛教训。

这次依旧沿着之前的想法进行计算,但是需要引入一个cache,没有这个代码不能被AC,查了一下采用hashmap的字典(这里不能用列表,尝试过会报错,因为列表未初始化长度是没有cache[n]的),有这样的表示方法可以加速计算过程。

cache = {}

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n in cache:
            return cache[n]
        if n == 1:
            return 1
        if n == 2:
            return 2
        else:
            res = self.climbStairs(n-1) + self.climbStairs(n-2)
        cache[n] = res
        return res

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值