《剑指offer》变态跳台阶(Java)

本文详细解析了青蛙跳台阶问题的两种算法实现方法。一种是递归方式,通过不断调用自身来计算不同台阶的跳跃方式总数。另一种是迭代方式,利用动态规划思想,避免了重复计算,提高了效率。文章提供了完整的代码示例,帮助读者理解和掌握算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

AC代码
方法一
public class Solution {
    public int JumpFloorII(int target) {
        int ans=0;
        if(target==1||target==0)
            return 1;
        if(target==2)
            return 2;
        for(int i=0;i<target;i++){
            ans+=JumpFloorII(i);
        }
        return ans;
    }
}
方法二

​ ​ ​ ​ ​ ​ ​用Fib(n)表示跳上n阶台阶的跳法数。
​ ​ ​ ​ ​ ​ ​Fib(1)=1,从第0层直接一步到第1层;
​ ​ ​ ​ ​ ​ ​Fib(2)=2,从第0层先走一步到第1层,然后再走一步到第2层;(1)
​ ​ ​ ​ ​ ​ ​从第0层直接迈两步走到第2层;(2)
​ ​ ​ ​ ​ ​ Fib(3)=4,从第0层开始,每次只上一个台阶,最终到第3层;(1)
​ ​ ​ ​ ​ ​ 从第0层开始,先到第2层,然后再走一步到第3层,由于从第0层开始到第二层Fib(2)有两种方式,所以,先到第二层再到第三层的方案有2种;(3)
​ ​ ​ ​ ​ ​ 从第0层直接走到第3层(4);
​ ​ ​ ​ ​ ​ 能发现Fib(n)=Fib(n-1)+Fib(n-2)+…+Fib(1)+1,这里为了好理解,可以将Fib(0)看作是从第0层直接到第n层的跳法,Fib(0)=1。所以Fib(n)=Fib(n-1)+Fib(n-2)+…+Fib(1)+Fib(0)。
​ ​ ​ ​ ​ ​ 因此,有 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>=3】,然后根据这个公式写代码。

public class Solution {
    public int JumpFloorII(int target) {
        //保证不会出现边界溢出
        int cnt[]=new int[target+5];
        cnt[0]=1;cnt[1]=1;cnt[2]=2;
        if(target<3)
            return cnt[target];
        for(int i=3;i<=target;i++){
             cnt[i]=2*cnt[i-1];
        }
        return cnt[target];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值