每天两道编程题---剑指offer(9):跳台阶问题

题目描述:

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

解题思路:

我没有找到用显式递归解决该问题的方法,只是在解题过程中用到了递归的思想。

显而易见,n=1时只有一种方法。当n>=2时,可以分情况讨论青蛙跳的级数。若第一次跳1级,问题就变成了求青蛙跳n-1级有多少种方法;若第一次跳2级,问题就变成了求青蛙跳n-2级有多少种方法......依此类推,问题就分解成了一个求和问题。令M(n)是青蛙跳n级的方法,则M(n) = M(n-1) + M(n-2) + ......+ M(2) + M(1) + 1,这里最后加1是因为可以一下跳完n级。等式右边的式子实际上是多重递归,计算机会完成中间的复杂计算。

附上代码:

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 1){
            return 1;
        }
        if(target == 2){
            return 2;
        }
        if(target >= 3){
            int total = 1;
            for(int i=1;i<target;i++){
                total += JumpFloorII(i);
            }
            return total;
        }
        return 0;
    }
}

性能结果:

运行时间:18ms,占用内存:9284K

优秀解法:

利用数学归纳法进行M(n)的进一步推导,可以得到M(n) = 1 (n=0或1);2*M(n-1)(n>=2)。这样就可以直接用显示递归求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值