剑指offer8:青蛙跳台阶

1. 题目描述

  一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

2. 思路和方法

  青蛙每一次跳跃只有两种选择:一是再跳1级阶梯到达第n级阶梯,此时小青蛙处于第n-1级阶梯;或者再跳2级阶梯到达第n级阶梯,此时小青蛙处于n-2级阶梯。于是,n级阶梯的跳法总是依赖于前n-1级阶梯的跳法总数f(n-1)和前n-2级阶梯的跳法总数f(n-2)。因为只有两种可能性,所以,f(n)=f(n-1)+f(n-2);

  递推公式f(n)=f(n-1)+f(n-2):很熟悉,就是斐波那契数列求和验证一下,青蛙1级有1种跳法,2级有2种跳法,3级有3种跳法,4级有5种跳法。

3. C++核心代码

3.1 递归(效率低,时间复杂度O(n2))

 1 class Solution {
 2 public:
 3 int jumpFloor(int number) {
 4         if(number==1)
 5             return 1;
 6         else if(number==2)
 7             return 2;
 8         else{
 9             return jumpFloor(number-1)+jumpFloor(number-2);
10         }
11     }
12 };

3.2 非递归(时间复杂度O(n))

 1 class Solution {
 2 public:
 3     int jumpFloor(int number) {
 4         if (number < 0)
 5         {
 6             return 0;
 7         }
 8         if (number == 0 || number == 1 || number == 2)
 9         {
10             return number;
11         }
12         int f1 = 1;
13         int f2 = 2;
14         int result = 0;
15         for (int i = 3; i <= number; i++)
16         {
17             result = f1 + f2;
18             f1 = f2;
19             f2 = result;
20         }
21         return result;
22     }
23 };

参考资料

https://blog.csdn.net/qq_33022911/article/details/83536283

原文地址:https://www.cnblogs.com/wxwhnu/p/11407175.html

时间: 2024-10-09 02:34:52

剑指offer8:青蛙跳台阶的相关文章

剑指offer青蛙跳台阶问题

(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级.求该青蛙跳上一个n 级的台阶总共有多少种跳法. //递归方式 public static int f(int n) { //参数合法性验证 if (n < 1) { System.out.println("参数必须大于1!"); System.exit(-1); } if (n == 1 || n == 2) return 1; else return f(n - 1) + f(n - 2); } //非递归方式 publ

【剑指Offer】跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路 递归,由上一步到这一步青蛙跳了一级或跳了两级,当前台阶数为n,那跳n级台阶的方法数就是问跳n-1和跳n-2级楼梯方法数相加.由此可看出,这是一个斐波那契数列. 结束条件就是当n=1时,只有一种方法(跳一级):n=0时,0种方法:当n=2时,有两种方法(一次跳一级,跳两次:一次直接跳两级) 代码实现 class Solution { public: int jumpFloor(int n

9、剑指offer--变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路:可知本题f(n)=f(1)+f(2)+...+f(n-1)+1;通过数学归纳法得到f(n)=2^(n-1) 1 #include <iostream> 2 using namespace std; 3 class Solution { 4 public: 5 //fn=2^(n-1) 6 int jumpFloorII(int number) { 7 if(num

剑指OFFER之跳台阶(九度OJ1388)

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 5 样例输出: 8 题目分析: 这道题很明显正向分析是不行的,也就是说,最后面的一个台阶,要依赖于前面台阶的.所以,最后一个台阶的方法数目可以由前面计算出来.那么,仔细想一下,一个青蛙只能跳1-2步,也就是说,

剑指offer——变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 问题分析 由于每次跳的阶数不确定,没有一个固定的规律,但是可以了解的是后一次跳是在前一次跳的结果上累加的,因此我们可以考虑使用递归的方法来解决问题. 那么从递归的三个步骤开始寻找解决方案: 1. 递归截止条件. 由于每次可以跳1-n的任意阶数,因此无论有多少阶,都可以一次跳完,为了表示方便,我们将一次性跳完的情况设为F(0),当n=1时,只能有一种情况,F(1) = 1.当n

剑指offer----------------青蛙跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路: 把N阶台阶的跳法看成是n的函数,记为f(n).当n=2时,有两级台阶,有两种跳法:一个是分两次跳,每次跳1级,另一种是一次跳2级. 当n>2时,第一次跳有两种选择,一是一次跳一级,此时跳法数目等于后面的剩下的n-1级台阶的跳法数目,即为f(n-1).另一种选择是 第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为分f(n-2).因此n级台阶的不同的跳法总数为f(n)=f

(原)剑指offer变态跳台阶

变态跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析一下明天是个斐波那契数列,我们一步一步退出其通项公式. 设台阶数为n, 总跳法为jumps n          jumps 1 1 2 2 3 4 4 8 5 16 现在猜测其通项公式为 fbonicc(n) = 2 * fbonicc(n - 1) 列出4的全部跳法 5的全部跳法 1111 1111 (1) 2  11

《剑指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)当最后一步只

剑指offer 08跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). java版本: public class Solution { public static void main(String[] args){ long startTime=System.currentTimeMillis(); System.out.println("第30项的结果是:"+JumpFloor(30)); long endTime=System.cur

剑指:变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路: 关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) = 1 f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数. f(3) = f(3-1) + f(3-2) + f(3-3) ... f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n