[leet code] Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

开始觉得并不难, 最初思路是用2 steps的出现次数做循环, 每次循环计算出2steps出现在不同地方的可能性.  经过一轮努力始终得不到一个common function最终放弃.

查阅网上解决方案后得知有一种数列叫斐波那契数列-Fibonacci!!! (基础不好是硬伤).  大概意思是每一个数是前面两个数字之和. e.g. a1 = 1, a2 = 2,于是a3 = a1+a2 = 3, a4 = a2 + a3 = 5.

回到我们的题目, 攀登n级楼梯方法数其实是等于攀登n-1级楼梯的方法数+攀登n-2级楼梯的方法数. 也就是说如果我们已经攀到n-1级,下一步只需要再上一次1step就到n级; 而如果我们已经攀到第n-2级, 下一步只需要再上一次2 step就可以登上n级楼梯.  注意由于最后一步攀登的级数不同, 于是这两set攀登方法(n-1, n-2)没有任何重复.

于是最直接的递归实现为

public class Solution {
    public int climbStairs(int n) {
        if (n<2) return 1;
        return climbStairs(n-1) + climbStairs(n-2);
    }
}

运行结果提示超时!

于是将递归改为循环:

public class Solution {
    public int climbStairs(int n) {
        if (n<2) return 1;
        
        int step1 = 1;
        int step2 = 1;
        
        for (int i=2; i<=n; i++){
            int stepn = step1 + step2;
            step1 = step2;
            step2 = stepn;
        }
        return step2;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值