爬楼梯
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
您在真实的面试中是否遇到过这个题?
Yes
样例
比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法
返回 3
标签
分析:这是一道动态规划的题目,其实是斐波那契的变形。我开始用递归的方法写,但是只通过百分之70显示超时,代码如下
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
return cal_fun(n);
}
int cal_fun(int n){
if(n==1){
return 1;
}
else if(n==2)
{
return 2;
}
return cal_fun(n-1)+cal_fun(n-2);
}
};
想了一下,因为这种方法有很严重重复的问题,比如n=10
从上图中不难发现:在这棵树中有很多结点是重复的,而且重复的结点数会随着n的增大而急剧增加,这意味计算量会随着n的增大而急剧增大。事实上,用递归方法计算的时间复杂度是以n的指数的方式递增的,所以比迭代还要慢。
于是我就采用了循环的办法,找出其中规律,从下往上计算。根据f(0)和f(1)计算出f(2),然后根据 f(1)和f(2)算出f(3),以此类推就可以算出第n项。时间复杂度是O(n)
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
int one=0,two=1;//f(0)+f(1)=f(2)
int sum=0;
for(int i=0;i<n;i++){
sum=one+two;
one=two;
two=sum;
}
return sum;
}
};
爬楼梯
Accepted
总耗时:
388 ms
100% 数据通过测试.