斐波那契系列问题的递归和动态规划2

【题目】

给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法。

【举例】

N=3,可以三次都跨1个台阶;也可以先跨2个台阶,再跨1个;或者先跨1个,再跨2个。所以有三种走法,返回3.

【代码】

        public static void main(String[] args) {
        //进阶1
        System.out.println(s1(5));//8 (1,2,3,5,8,12)
        System.out.println(s2(5));//8
        System.out.println(s3(5));//8       
    } 

    //给定台阶数,返回走法数
    //方法1:暴力递归,O(2^N)
    public static int s1(int n){
        if(n<1){
            return -1;
        }
        if(n==1||n==2){
            return n;
        }
        //最后跳上第N级的情况,要么是从N-2级直接跨2级跳上,要么是从N-1级跨1级跳上
        //故 s(n)=s(n-1)+s(n-2)
        //类似斐波那契数列,唯一的不同是初始项不同
        return s1(n-1)+s1(n-2);
    }

    //方法2:依次从左到右求出每一项的值,O(N)
    public static int s2(int n){
        if(n<1){
            return -1;
        }
        if(n==2||n==1){
            return n;
        }
        int res=2;//初始第二项
        int pre=1;//初始第一项
        int temp=0;
        for(int i=3;i<=n;i++){
            temp=res;
            res=res+pre;
            pre=temp;
        }
        return res;
    }

    //方法3:矩阵乘法思想,O(logN)
    //(s(n),s(n-1))=(2,1)×{{1,1},{1,0}}^(n-2)
    public static int s3(int n){
        if(n<1){
            return -1;
        }
        if(n==2||n==1){
            return n;
        }
        int[][] base={{1,1},{1,0}};
        int[][] res=matrixPower(base,n-2);//状态矩阵的n-2次方      
        return 2*res[0][0]+res[1][0];   
    }

【题目】 (青蛙变态跳)

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

【思路】

假设跳上第n个台阶有f(n)种方法,则f(1)=1,f(2)=2,f(3)=4,f(4)=8,我们隐约感觉到f(n)=2^(n-1)。但是需要证明下,同样根据我们根据上篇文章中跳台阶的思路,可以得到f(n)=f(n-1)+f(n-2)+….+f(1)+1,而f(n-1)=f(n-2)+….+f(1)+1,两个式子相减,得到f(n) = 2f(n-1),很明显可以得到f(n)=2^(n-1)。

【代码】

    public int JumpFloorII(int target) {
        if(target<=0) return 0;
        if(target==1) return 1;
        int res=1;
        while(--target!=0){
            res*=2;
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值