算法经典问题----爬楼梯

1、问题阐述

假设你现在正在爬楼梯,楼梯有 n级。每次你只能爬 1 级或者 2 级,那么你有多少种方法爬到楼梯的顶部?

2、解决思路

该问题的解决方法有两种,一个是利用斐波那契数列,即递归方法,另一种是利用动态规划方法。如果n值很大,递归方法耗时长。当值很大时,前者耗时是后者的成百上千倍,甚至前者会出现运行时间过长的异常现象。这是因为每一次递归,都要重新计算,导致耗时过长。

3、代码如下

package com.learn;

import javax.sound.midi.Soundbank;

public class UpstairsMethod {
    public static void main(String[] args) {
        System.out.println(getTotal(20));    // 10946
        System.out.println(getTotal2(20));     // 10946
    }

    /**
     * 递归方法
     * @param step
     * @return
     */
    public static long getTotal(int step){
        if(step <= 0){
            return 0;
        }
        if(step <= 1){
            return 1;
        }
        if(step == 2){
            return 2;
        }
        return getTotal(step-1) + getTotal(step-2);
    }

    /**
     * 动态规划
     * @param step
     * @return
     */
    public static long getTotal2(int step) {
        int i=1, j=2;
        int k = 3; // 第三步
        int sum = 0;
        if (step <= 0){
            return 0;
        }
        if(step <= 1) {
            return i;
        }
        if(step == 2){
            return j;
        }
        while (k <= step){
            sum = i + j;
            i = j;
            j = sum;
            k++;
        }
        return sum;
    }
}

建议在解决该种问题时,采用动态规划的方法,避免当n值过大时,出现运行时间过长的异常。

ps:如有不足,期待您的指点,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值