题目:
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?
思想1:使用穷搜,结果超时。
class Solution {
public:
int climbStairs(int n) {
int count = 0;
void dfs(0, count, n);
return count;
}
private:
void dfs(int cur, int &count, int n) {
if(cur == n) {
count++;
return;
}
if(cur > n) {
return;
}
dfs(cur+1, count, n);
dfst(cur+2, count,n);
}
};
思想2:后来想最后一步可以跨一步或者两步,则S(n) = S(n-1) + S(n-2),使用递归,结果还超时。
class Solution {
public:
int climbStairs(int n) {
if(n == 1)
return 1;
if(n == 2)
return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
};
思想3:其实这题就是斐波那契数列,递归的话求了两遍,应该记下结果
class Solution {
public:
int climbStairs(int n) {
if(n == 1)
return 1;
if(n == 2)
return 2;
int f0 = 1, f1 = 2,ans;
for(int i = 0; i < n-2; i++) {
ans = f0 + f1;
f0 = f1;
f1 = ans;
}
return ans;
}
};