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?

我会告诉你,我当初考研复试,面试的时候被问了这道题目了吗,当初没答出来,shit,现在看太naive了,斐波那契。

 

class Solution {
public:
    int climbStairs(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        vector<int> tmp(n);
        tmp[0]=1;
        tmp[1]=2;
        for(int i=2 ; i<n ; i++){
            tmp[i]=tmp[i-1]+tmp[i-2];
        }
        return tmp[n-1];
    }
};

 

几行代码搞定

 当然空间复杂度可以没必要这么高了,因为斐波那契只需要记住以前的两个数而已。所以代码也可以是这样的

class Solution {
public:
    int climbStairs(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        int cn_2=1;
        int cn_1=2;
        int reval;
        for(int i=2 ; i<n ; i++){
            reval=cn_2+cn_1;
            cn_2=cn_1;
            cn_1=reval;
        }
        return reval;        
    }
};

 

 

 

posted @ 2013-01-05 16:37  和道一文字  阅读(144)  评论(0)    收藏  举报