题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
我的解题:
1.我的第一反应居然是做电话号码组合那道题的方法,广度优先搜索的方法
测试过了10个,表示超出时间限制——失败!
不过最起码是能做出来的,也还是有进步的吧
class Solution {
public:
int climbStairs(int n) {
queue<int> q;
int count=0;
for(int i=1;i<=2;i++){
if(i<n) q.push(i);
else if(i==n) count++;
}
while(!q.empty()){
for(int i=0;i<q.size();i++){
for(int j=1;j<=2;j++){
if(q.front()+j<n) q.push(q.front()+j);
else if(q.front()+j==n) count++;
}
q.pop();
}
}
return count;
}
};
2.动态规划
发现动态规划的方法后,方法自己写的方法一太蠢了。。。。。。
到达第i层楼梯的方法 = 达到第i-1层楼梯的方法 + 达到第i-2层楼梯的方法
class Solution {
public:
int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
vector<int> v(n);
v[0]=1;
v[1]=2;
for(int i=2;i<n;i++)
v[i]=v[i-1]+v[i-2];
return v.back();
}
};