剑指:跳台阶

一只青蛙一次可以跳上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;即相当于是个斐波那契数列。

解:

我们可以递归的方式:

public class Solution {
    public int JumpFloor(int target) {
        if(target <= 0)
            return -1;
        if(target == 1)
            return 1;
        if(target == 2)
            return 2;
        else
            return JumpFloor(target-1) + JumpFloor(target-2);
    }
}

递归的方式开销可能会很大,因为递归里面有很多重复的计算,所以我们可以改成迭代的方式。

public class Solution {
    public int JumpFloor(int target) {
        if(target <= 0)
            return -1;
        if(target == 1)
            return 1;
        if(target == 2)
            return 2;
        int n1 = 1;
        int n2 = 2;
        int total = 0;
        for(int i=2; i<target; i++){
            total = n1 + n2;
            n1 = n2;
            n2 = total;
        }
        return total;
    }
}

原文地址:https://www.cnblogs.com/lisen10/p/10976520.html

时间: 2024-08-02 20:55:32

剑指:跳台阶的相关文章

8、剑指offer--跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路:f(n)=f(n-1)+f(n-2);且0 1 2需要单独处理 1 #include <iostream> 2 using namespace std; 3 class Solution { 4 public: 5 //fn=f(n-1)+f(n-2) 6 //f1=1 f2=2 7 int jumpFloor(int number) { 8 int result[3]={0,1,2

剑指offer-09-跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 题目分析 青蛙只跳1或2可以得出是一个斐波那契问题,即a[n]=a[n-1]+a[n-2],那么能跳1,2,3个台阶时a[n]=a[n-1]+a[n-2]+a[n-3],...... 则有: a[n] =a[n-1]+a[n-2]+......+a[1];..........................① a[n-1] = a[n-2]+......+a[1];.....

剑指offer-008-跳台阶

题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: 发波那契数列变形. 问题的解依赖子问题的解.同样用分治,或者bottom-up动态规划. 如果青蛙在第n级台阶上,那么它上一跳一定是在n-1, 或者n-2层台阶上. 假设f(n) 是跳n级台阶的所用跳法,那么 f(n) = f(n - 1) + f(n - 2) base case: f(1) = 1; f(2) = 2; 代码: 1. 递归(不推荐) publ

剑指offer---跳台阶

class Solution { public: int jumpFloor(int number) { // if (number == 1) { return 1; } else if (number == 2) { return 2; } else { return(jumpFloor(number - 1) + jumpFloor(number - 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之变态跳台阶(九度OJ1389)

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解题思路: 这道题目跟之前的跳台阶大同小异,只是跳台阶的阶数从1变到了n,也就是说,不再是跳一下或者跳两下的问题,而是跳n下的问题.那么解题的思路显然还得逆向分析,我们

(原)剑指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] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) { if(number == 1) return 1; if(number == 2) return 2; int n1 = 1; int n2 = 2; int rtn = 0; for(int i = 3; i <= number; i++) { rtn = n1 + n2; n1 = n2;

剑指offer源码系列-跳台阶

这是一个斐波那契数列的变形 题目1388:跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:3030解决:1226 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 5 样例输出: 8 #include<iostream> #includ