剑指:变态跳台阶

题目描述

一只青蛙一次可以跳上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)

说明:

1)这里的f(n) 代表的是n个台阶有一次1,2,...n阶的 跳法数。

2)n = 1时,只有1种跳法,f(1) = 1

3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)

4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,

那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)

因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)

5) n = n时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) =>
f(0) + f(1) + f(2) + f(3) + ... + f(n-1)

6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:

f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) =
f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) +
f(n-1) = f(n-1) + f(n-1)

可以得出:

f(n) = 2*f(n-1)

7) 得出最终结论,在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

| 1       ,(n=0 )

f(n) =     | 1       ,(n=1 )

| 2*f(n-1),(n>=2)

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

另一种写法

public class Solution {
    public int JumpFloorII(int target) {
        int jumpFlo=1;
        while(--target != 0)
        {
            jumpFlo*=2;
        }
        return jumpFlo;
    }
}

再另一种写法

public class Solution {
    public int JumpFloorII(int target) {
         return  1<<--target;
    }
}

左移1位就是乘以一个2,在1基础上左移 target-1 位就是1乘以 2^(target-1)

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

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

剑指:变态跳台阶的相关文章

(原)剑指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)

剑指:跳台阶

一只青蛙一次可以跳上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——跳台阶

解法: 直接用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]

[剑指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级台阶,也可以跳上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源码系列-变态跳台阶

题目1389:变态跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1906解决:1102 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解法分析: 分析:用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙

(原)剑指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 9.变态跳台阶

9.变态跳台阶 题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路 与上题相似,假设要到3级,那么可以从0,1,2级直接到三级,那么f3=f1+f2+1,f2=f1+1,f3=4,找规律. 也可以换一种思路,不限制长度,那就是每一级都可以跳,只有选择跳和不跳,那么就是2^(n-1),结果一样. 代码 public static int JumpFloor(int target) { if (target <= 0) { re