算法题:跳台阶

这是一道比较经典的算法题,这里有两种跳法,其他许多的算法题思想都和这道题类似
一、 一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)

//方式一: 使用递归解决
    public int JumpMethod(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        return JumpMethod(n-1)+JumpMethod(n-2);
    }
    //方式二:因为方式一中递归会存在大量重复计算值的情形,所以可以设置一个hash表,进行值的存储,
    // 如下次遇到相等的值直接取出,降低时间复杂度
    public  int JumpMethodPlus(int n, HashMap<Integer,Integer> map) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        //如果hash表中包含某个跳的台阶数,对应的值就是跳的方法数,则取出改value
        if (map.containsKey(n)) {
            return map.get(n);
        } else {
            int value = JumpMethodPlus(n - 1, map) + JumpMethodPlus(n - 2, map);
            //把计算出的value值放入hash表中
            map.put(n, value);
            return value;
        }
    }
     //方式三:自底向上,使用迭代,降低空间复杂度
        public int JumpFloorPlus2(int n){
                 if(n<1){
                     return 0;
                 }
                 if(n==1){
                     return 1;
                 }
                 if(n==2){
                     return 2;
                 }

                 int a=1;
                 int b=2;
                 int temp=0;

                 for(int i=3;i<n;i++){
                     temp=a+b;
                     a=b;
                     b=temp;
                 }
                 return temp;

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

   /*
        这个可以用数学来解释
          F(n) = F(n-1)+F(n-2)+...+F(1)
          F(n-1) = F(n-2)+F(n-3)+...+F(1)
          两个式子相减,很容易得出F(n)=2F(n-1)
         */
public int JumpMethod2(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        return 2*JumpMethod2(n-1);
     
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值