2020年10月23日 变态青蛙跳台阶问题

本文探讨了青蛙跳上n级台阶的不同解决策略,从递归迭代到动态规划,对比了三种方法的时间复杂度,并重点介绍了利用递推公式f[n]=2^n-1简化问题,以降低至O(n)的高效解决方案。

题目描述

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

思路一

自己参考之前的迭代方法
f(n) = f(n-1)+f(n-2)+…+f(1)+f(0);
写出来的代码为

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

虽然能通过,但是时间复杂度很高O(n^2)

思路二

对于方法一中的:f[n] = f[n-1] + f[n-2] + … + f[0]

那么f[n-1] 为多少呢?

f[n-1] = f[n-2] + f[n-3] + … + f[0]

所以一合并,f[n] = 2*f[n-1],初始条件f[0] = f[1] = 1

所以可以采用递归,记忆化递归,动态规划,递推。具体详细过程,可查看青蛙跳台阶。

这里直接贴出递推的代码。

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

思路三

当然,你会发现一个规律:

f[0] = f[1] = 1

f[2] = 2 = 2^1

f[3] = 4 = 2^2

f[4] = 8 = 2^3

f[n] = 2^n-1

所以,针对本题还可以写出更加简单的代码。

return Math.pow(2, n-1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值