剑指offer—跳台阶扩展问题

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。

  该题属于之前那青蛙跳台阶的扩展问题,仅仅多了一个条件,这次青蛙无论多少阶的台阶都能跳了(大长腿青蛙),按照我这小白的思维,这个问题就是在之前的青蛙跳台阶的每种方式的上加了一种嘛,之前跳三级台阶有三种方法:1·1·1,1·2和2·1,现在增加了一种就是直接跳三级,方法变成了四种,以此类推,四级台阶现在的方法就有跳一级再直接跳三级,跳二级再直接跳二级,跳三级再跳一级,以及直接跳四级,所以f(4) = f(1)+f(2)+f(3)+1,f(2)=2,f(3)=f(1)+f(2)+1,f(1)=1,此处f(n)为青蛙跳n级台阶的方法数。原理清楚了,那方法可以用递归,也能用循环。所以代码是在斐波拉契数列的基础上进行了一点改造(我这写的是真的烂)。

class Solution:
    def jumpFloorII(self, number):  # 根据之前的青蛙台阶问题,采取相同的思想方法
        if number < 2:  # 第一级有一种方法、第二级有两种方法、第三级有四种方法、第四级有十六种方法……
            return 1  # 分析可得 f(1)=1,f(2)=f(1)+1=2,f(3)=f(1)+f(2)+1=4
            # f(4)=f(1)+f(2)+f(3)+1=16……
        elif number == 2:  # 由上以此类推则有f(n)=f(n-1)+f(n-2)+f(n-3)+...+1
            return 2  # 多出来的1是因为青蛙可以跳任意阶级,所以这个1就是一次直接跳n级
        else:

            save = []  # 将跳每n级的方法数存储起来,通过循环相加起来可得出答案
            for i in range(number):
                sum = 0
                for j in range(len(save)):
                    sum = sum + save[j]
                save.append(sum + 1)
            return save[-1]

上面的是我自己想的,然后翻讨论区的时候才发现大佬的答案是真的简洁明了,收获满满,说实话,下面这个一行代码解决问题的是真的真的真的打击我QAQ!!

class Solution:
    def jumpFloorII(self, number):  # 通过观察规律发现青蛙跳的级数n和方法数x存在x=2^n的关系
        return pow(2, number - 1)

下面这个就舒服很多,和我的思路相同(算是吧),使用递归的方法,代码简洁,就是我对递归实在不怎么深入,经常被自己绕进去,就算看懂了大佬的递归代码,自己也很难写出来一个帅气的递归。

class Solution:
    def jumpFloorII(self, number):  # 与方法一相同的思路,但采用的是递归的方法
        if number == 0:
            return 1
        count = 0
        for i in range(number):
            count += self.jumpFloorII(i)
        return count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值