戴璞微的博客

简单点!做事的动机简单点

剑指offer--变态跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。


思路:
当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;
当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;
当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法; 第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法
Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法……………………..第一次跳出n阶后,后面还有 Fib(n-n)中跳法.
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+……….+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-1)
又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-2)
两式相减得:Fib(n)-Fib(n-1)=Fib(n-1) =====》 Fib(n) = 2*Fib(n-1) n >= 2


Java代码:

public class Solution {
    static int[] dp = new int[10000];

    public int JumpFloorII(int target) {
        if ( target <= 0){
            return 0;
        }

        if ( target == 1){
            dp[target] = 1;
            return dp[target];
        }

        if (target == 2){
            dp[target] = 2;
            return dp[target];
        }

        for ( int i = 3 ; i <= target ; i++){
            dp[i] =  2 * dp[i-1];
        }

        return dp[target];
    }
}

C++代码

class Solution {
    public:
        int data[1000000];
        int jumpFloorII(int number) {
            if(number == 1){
                data[number] = 1;
            }
            if(number == 2){
                data[number] = 2;
            }
            for(int i = 3 ; i <= number ; i++){
                data[i] = 2*data[i-1];
            }
            return data[number];
        }
};
阅读更多
版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945 https://blog.csdn.net/qq_30091945/article/details/70195262
个人分类: 面试真题在线编程
所属专栏: 剑指offer题解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭