LeetCode第70题:爬楼梯

问题描述

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

注意:给定 n 是一个正整数。

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1、1 阶 + 1 阶
2、 2 阶

示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1、 1 阶 + 1 阶 + 1 阶
2、 1 阶 + 2 阶
3、 2 阶 + 1 阶

解题思路

如果要走n阶楼梯,第一次可以走1步或者2步,接下来继续走n-1或者n-2步。
很明显的斐波拉契数列,T(n)=T(n-1)+T(n-2),递归和循环都可以很容易的实现。
不过还是建议用循环解决,毕竟递归解决的话时间复杂度是O((1.618)^n),时间开销太大。
循环解决的话,分析易得时间复杂度为O(n),空间复杂度为O(1)。

C++代码

class Solution {
public:
    int climbStairs(int n) {
        if(n<1)
            return 0;
        else if(n==1)
            return 1;
        else if(n==2)
            return 2;
        
        //T(n)=T(n-1)+T(n-2) 
        //斐波拉契数列循环实现
        int fibOne=1;
        int fibTwo=2;
        int fibFinal=0;
        for(int index=3;index<n+1;++index){
            fibFinal=fibOne+fibTwo;
            fibOne=fibTwo;
            fibTwo=fibFinal;
        }
        
        return fibFinal;
    }
};

运行结果

posted @ 2019-01-02 09:14  朕蹲厕唱忐忑  阅读(190)  评论(0编辑  收藏  举报