爬楼梯问题(递归/动态规划)java实现

问题描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 

问题分析:

这是一道十分经典的动态规划题目,我们可以用递归或者动态规划来实现求解。
首先,假设n阶楼梯有 f(n)种方法爬到楼顶,由题意可知,我们每次可以爬1或2个台阶,因此我们可以得到如下递推式:

               f(n) = f(n - 1) + f(n - 2)

我们还可以由题意知道以下初始条件:

               f(1) = 1 ,f(2) = 2

现在我们就可以使用递归或者动态规划的思想来解决这个问题。由于递归的效率偏低,而且还可能出现栈溢出的问题,因此我们这里使用动态规划来实现代码。

java代码实现:

    public int climbStairs(int n) {
        //楼梯阶数为1或2则直接返回结果
        if(n == 1){
            return 1;
        }
        if(n == 2){
            return 2;
        }

        //用数组f来存放不同阶数楼梯的走法
        int[] f = new int[n];

        f[0] = 1; //f[0]表示阶数为1时有1种走法
        f[1] = 2; //f[1]表示阶数为2是有2种走法

        for(int i = 2; i < f.length; i++){
            f[i] = f[i-1] + f[i-2]; //核心步骤,由低阶楼梯的走法数递推得到高阶楼梯的走法数
        }
        return f[n-1]; //注意返回的是f[n-1],因为数组的下标从0开始,f[n-1]就对应n阶楼梯的走法数
    }

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值