《剑指offer》---跳台阶问题

本文算法使用python3实现


1. 问题1

1.1 题目描述:

??一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
??时间限制:1s;空间限制:32768K


1.2 思路描述:

??(1)当 $ n=0 $ 时,返回0
??(2)当 $ n=1 $ 时,只有一种跳法:跳1级台阶。
??(3)当 $ n=2 $ 时,有两种跳法:(a) 跳1级再跳1级;(b) 直接跳2级。
??(4)当 $ n=3 $ 时,我们只考虑最后一步的情况:(a)当最后一步只跳1级时, $ f(3)=f(3-1) $ ;(b)当最后一步直接跳2级时, $ f(3)=f(3-2) $ 。因此 $ f(3)=f(3-1) + f(3-2) $
??(5)以此类推,当 $ n=N $ 时,只需考虑最后一步的情况即可:(a)当最后一步只跳1级时, $ f(N)=f(N-1) $ ;(b)当最后一步直接跳2级时, $ f(N)=f(N-2) $ 。因此 $ f(N)=f(N-1) + f(N-2) $


1.3 程序代码:

class Solution:
    # def jumpFloor(self, number):
    #     '''递归:提交代码超时了'''
    #     if number in [0, 1, 2]:
    #       return number
    #     return self.jumpFloor(number-1)+self.jumpFloor(number-2)

    def jumpFloor(self, number):
        '''迭代'''
        floor = []
        for i in range(number+1):
            if i in [0,1,2]:
                floor.append(i)
                continue
            floor.append(floor[i-1]+floor[i-2])
        return floor[-1]

2. 问题2

2.1 题目描述:

??一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法
??时间限制:1s;空间限制:32768K


2.2 思路描述:

??(1)当 $ n=0 $ 时,返回0
??(2)当 $ n=1 $ 时,只有一种跳法:跳1级台阶。
??(3)当 $ n=2 $ 时,有两种跳法:(a) 跳1级再跳1级;(b) 直接跳2级。
??(4)当 $ n=3 $ 时,我们只考虑最后一步的情况:(a)当最后一步只跳1级时, $ f(3)=f(3-1) $ ;(b)当最后一步直接跳2级时, $ f(3)=f(3-2) $ ;(c) 当最后一步直接跳3级时, $ f(3) = 1 $ 。因此 $ f(3)=f(3-1) + f(3-2) +1 $
??(5)以此类推,当 $ n=N $ 时,只需考虑最后一步的情况即可:(a)当最后一步只跳1级时, $ f(N)=f(N-1) $ ;(b)当最后一步直接跳2级时, $ f(N)=f(N-2) $ ;(c) 当最后一步直接跳3级时, $ f(N) = f(N-3) $;...;(n)当最后一步直接跳N级时, $ f(N) = 1 $ 。因此 $ f(N) = f(N-1)+f(N-2)+f(N-3)+...+f(1)+1 $


2.3 程序代码:

class Solution:
    def jumpFloorII(self, number):
        '''迭代法,保存n次结果'''
        floor = []
        for i in range(number+1):
            if i in [0,1,2]:
                floor.append(i)
                continue
            step = 0
            for k in range(i):
                step += floor[k]
            floor.append(step+1)
        return floor[-1]

    # def jumpFloorII(self, number):
    #     '''递归法:当number很大时,递归很深,会超时'''
    #     if number in [0,1,2]:
    #       return number
    #     res = 0
    #     for k in range(number):
    #       res += self.jumpFloorII(k)
    #     return res+1

原文地址:https://www.cnblogs.com/lliuye/p/9052224.html

时间: 2024-10-10 18:12:11

《剑指offer》---跳台阶问题的相关文章

(原)剑指offer跳台阶和矩形覆盖

跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析同样为斐波那契数列边形这样的题肯定有公式 设n级台阶,总跳法 jumps n jumps 1 1 2 2 3 3 4 5 5 8 猜测 fbonicc(n) = fbonicc(n-1) + fbonicc(n-2) 3 4 5 111 1111 1111(1) 21  211  211(1) 12  121 121(1) 112 112(1)

剑指Offer——跳台阶

解法: 直接用DP就行,因为这里限定了每次只能跳1格或者2格,所以只需要加上dp[i-1]和dp[i-2]的情况就行,相当于是状态转移到了i-1和i-2的时候可能跳到当前的状态的情况. class Solution { public: int jumpFloor(int number) { vector<int> dp(number+1, 0); dp[0] = 0; dp[1] = 1; dp[2] = 2; for(int i=3; i <= number; ++i) { dp[i]

剑指:跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 分析: 因为只能跳1级或2,假设n阶有f(n)种跳法. 所以有两种情况: a.如果第一次跳的是1阶,那么剩下的n-1个台阶,跳法有f(n-1). b.如果第一次跳的是2阶,那么剩下的n-2个台阶,跳法有f(n-2). 所以,可以得出总跳法:f(n) = f(n-1) + f(n-2) 而实际我们知道:只有一阶的时候 f(1) = 1:只有二阶的时候 f(2) = 2:即相当于是

[剑指Offer]2.变态跳台阶

题目 一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级--它也能够跳上n级. 求该青蛙跳上一个n级的台阶总共同拥有多少种跳法. 思路 用Fib(n)表示青蛙跳上n阶台阶的跳法数,设定Fib(0) = 1: 当n = 1 时. 仅仅有一种跳法,即1阶跳,即Fib(1) = 1; 当n = 2 时. 有两种跳的方式,一阶跳和二阶跳,即Fib(2) = Fib(1) + Fib(0) = 2; 当n = 3 时.有三种跳的方式,第一次跳出一阶台阶后,后面还有Fib(3-1)中跳法,第一次跳出二阶台阶后.

剑指offer:变态跳台阶

目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:变态跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路 这题的名字和题面都和跳台阶这题很相似,没看过的同学可以先看看. 很明显,这题最大的改变就是状态转移式由原来的f[n]=f[n-1]+f[n-2]变成了f[n]=1+f[1]+f[2]+...+f[n-1].这就意味着不能完全照搬斐波那契数列的思想进行解题.但这个状态转移式很明显也具有规律性,

牛客网上的剑指offer题目

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一个字符串中的空格替换成"%20" 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 剑指offer 斐波那契数列 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个

【剑指offer】斐波那契数列

题目1描述: 写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: f(n) = 0 (n = 0);  f(n) = 1 (n = 1);  f(n) = f(n-1)+f(n-2) (n > 1); 分析描述: 在大多数的C语言教科书中,一般会用递归求斐波那契数列.代码如下: long long Fibonacci(unsigned int n) { if(n <= 0) return 0; if(n <= 1) return 1; return Fibonacci(

【剑指Offer】文章索引(未完)

下面是牛客网剑指Offer编程题的一些解题报告,目前还没刷完,会一篇篇加上来. 跳台阶 变态跳台阶 矩形覆盖 重建二叉树 替换空格 用两个栈代替队列 斐波那契数列 二进制中 1 的个数 版权声明:本文为博主原创文章,未经博主允许不得转载.

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

剑指offer(1~10)题解

剑指offer(1~10) 二维数组中的查找 源代码 class Solution { public: bool Find(int target, vector<vector<int> > array) { for(int i = 0 ; i < array.size() ; i ++){ for( int j = array[i].size() - 1 ; j >= 0 ; j--){ if( array[i][j] == target){ return true;