JZ8 跳台阶

这篇博客探讨了一个经典的递推问题——青蛙跳台阶。青蛙每次可以跳1级或2级台阶,求解到达n级台阶的不同跳法数量。通过分析,得出递推公式f(n)=f(n-1)+f(n-2),并提供了两种解决方案:简单递推和自底向上的循环方法。文章详细解释了这两种方法的时间复杂度,并通过示例输入和返回值进行了说明。
摘要由CSDN通过智能技术生成

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

示例1

输入:2

返回值:2

示例2

输入:7

返回值:21

 

题目解析

这是一道经典的递推题目,你可以想如果青蛙当前在第n级台阶上,那它上一步是在哪里呢?

显然,由于它可以跳1级台阶或者2级台阶,所以它上一步必定在第n-1,或者第n-2级台阶,也就是说它跳上n级台阶的跳法数是跳上n-1和跳上n-2级台阶的跳法数之和

设跳上i级台阶有f(n) 种跳法,则它跳上n级的台阶有 f(n)=f(n-1)+f(n-2) 种跳法。

然后,我们又思考初始(n-2<0)的情况,跳上1级台阶只有1种跳法,跳上2级台阶有2种跳法,最终我们得到如下的递推式:

方法一:简单递推

package com.LeetCodeProblem.JZ;

public class JZ8 {
    public int jumpFloor(int target) throws IllegalAccessException {

        if (target<0)
            throw new IllegalAccessException("target应该不小于0");

        if (target>=0&&target<3) return target;

        return jumpFloor(target-1)+jumpFloor(target-2);
    }
}

时间复杂度O(2^n)

方法二:自底向上循环//同JZ7

package com.LeetCodeProblem.JZ;

public class JZ8 {

    public int jumpFloor(int target) throws IllegalAccessException {

        if (target<=0)
            throw new IllegalAccessException("target应该大于0");

        if(target>0&&target<3) return target;

        int t0=0;
        int t1=1;
        int tn=2;

        for (int i = 3; i <= target; i++) {
            tn=t1+tn;
            t1=tn-t1;
        }
        return tn;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值