剑指offer编程题青蛙跳台阶变态版java实现(递归,动规)

编程题青蛙跳台阶变态版java实现

题目描述

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

问题分析

我们先规定f(n)为剩下n阶台阶数对应的跳法种数,例如f(0)=f(target-target)代表有target级台阶,并且一次性跳了target级,这时只有一种跳法。f(1)=f(target-(target-1))代表有target级台阶,已经跳过了target-1级台阶,现在还剩一级,则跳上这一级台阶只有一种跳法。
f(2)=f(2-1)+f(2-2)表示一次跳一级或一次跳两级,共2种跳法。f(3)=f(3-1)+f(3-2)+f(3-3)表示先跳1级,则还有3-1=2级台阶的跳法和先跳2级还有一级台阶的跳法加上一次性跳三级的跳法就是跳上3级台阶的所有跳法。
经过了上述分析,我们可以得出结论:
f(n-1)=f((n-1)-1)+f((n-1)-2)+…+f((n-1)-(n-2))+f((n-1)-(n-1));

f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-(n-1))+f(n-n)
=f(n-1)+f((n-1)-1)+f((n-1)-2)+…+f((n-1)-(n-2))+f((n-1)-(n-1))=f(n-1)+f(n-1);

代码级解释

由上述的问题分析,我们可以得到f(n)=2*f(n-1),那么这个问题就很好求解了。

public class Solution {
    public int JumpFloorII(int target) {
        if(target<=0)return 0;
        int[] arr=new int[target+1];
        arr[0]=0;
        arr[1]=1;
        if(target>1){
            int count=2;
            while(count<target+1){
                arr[count]=2*arr[count-1];
                count++;
            }
        }
        return arr[target];
    }
}

我在贴一份牛客网上的递归解法,写的很简洁,而且他问题分析写的也挺不错的,可以看看:
解答的地址
来源:牛客网


public class Solution {
    public int JumpFloorII(int target) {
        if (target <= 0) {
            return -1;
        } else if (target == 1) {
            return 1;
        } else {
            return 2 * JumpFloorII(target - 1);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值