leetcode之Climbling Statirs的解题思路

原题目:

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?


    看到这道题的时候,我第一眼就想到递归,当前需要跨的阶梯数是n级,我当前是跨第一步呢,还是跨两步,那n级爬阶梯的求法就是这两种方法的总和。下面我给出递归的方法。

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


    这种递归的解法代码非常简洁,非常易懂,但是,后面的求解过程有很多是重复的,因此造成的效率是极地了。所以说,我们要采用非递归的方式进行。

思路:假如说,我现在需要爬三级阶梯,第一种方法是跨一步,那还剩下两步(剩下两步很显然,有两种方法),那现在这种方法与两步的方法数是一样的,所以说为2;第二种方法是跨两步,那还剩下一步,显而易见,只有一种方法。

把上面两种方法相加,就是爬三级阶梯的方法数。

同样的方法,我们知道四级阶梯的方法数是二级阶梯方法数与三级阶梯数的之和。

如果我们,先求出三级阶梯的方法数,再记录一下,再求四级阶梯的方法数,记录一下,一次往下求。。。,一直求到n级阶梯为止。这样就不需要重复求解。

还有一个节省内存空间的技巧,每次我只需要前面两级n-1和n-2的阶梯数,所以说我们每次只要记录前两次,用pre1和pre2记录,每次循环更新一下

   下面上代码:

class Solution {
public:
    int climbStairs(int n) {
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        int pre1=1;
        int pre2=2;
        int cur=pre2;
        for(int i=3;i<=n;i++)
        {
            cur=pre1+pre2;
            pre1=pre2;
            pre2=cur;
        }
        return cur;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值