Leetcode practice (6)

Climbing Stairs

  • 题目描述:爬楼梯,一次只能爬1step or 2step,给定一个非负数,问有多少种不重复的爬法。
  • 思路:乍看一下题目,还在思考如何枚举出所有可能的情况,eg,给定2,那么组合就是【1,1】,【2】;给定3,那么组合就是【1,1,1】【1,2】【2,1】, 其实用递归的思路去想就是当元素值等于1 or 等于2时,停止。后面发现该题目就是Fibonacci 数列的换个描述方式而已,自己还是太愚蠢了。eg,【1,1,3,5,8....】, 给定数是数列的索引,所以先生成Fibonacci 数列,找到对应目标索引 (即使给定非负数) 下的值即可。下面给出两个解法,一个是时间复杂度为 O(n), 空间复杂度为 O(1),  一个是时间复杂度为 O(log n), 空间复杂度为 O(1)。前一种解法总所周知,后一种解法通过数学变换直接表示出通项公式,我表示很风骚,论学好数学的重要性。
  • code:
class Solution:
    def climbStairs(self, n: int) -> int:
        first, second = 1, 1
        if n == 0 or n == 1:
            return 1
        for i in range(2, n + 1):
            first, second = second, first + second
        return second
class Solution:
    def climbStairs(self, n: int) -> int:
        formula_1 = 1 / math.sqrt(5)
        formula_2 = ((1 + math.sqrt(5)) / 2)**(n+1)
        formula_3 = ((1 - math.sqrt(5)) / 2)**(n+1)
        return  int(formula_1 * (formula_2 - formula_3))
  •  总结:题目本身是换汤不换药,换个汤还把我弄的蒙蔽了一下,实在不应该。第二种直接用公式来计算出 Fibonacci 数列对应索引的值这个方法确实风骚,应该是对该数列的一种近似表达。但是我在提交执行的时候,结果显示出来时间复杂度和空间复杂度的消耗却没有像理论猜想那样,不清楚具体是什么原因,在此记录,日后发现。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值