这道题可以说是动态规划里最最基础的题目了,剑指Offer中的青蛙跳台阶也是这样的题目。
循环的写法:
class Solution {
public:
int climbStairs(int n) {
vector<int> f(n); //数组记录爬到每一级台阶的方法数
if(n==1) return 1;
f[0] = 1;
f[1] = 2;
for(int i=2; i<n; i++) {
f[i] = f[i-1] + f[i-2];
}
return f[n-1];
}
};
采用记忆化递归,避免重复计算,可以保证运行不超时(否则会超时):
class Solution {
public:
int climbStairs(int n) {
f_ = vector<int> (n, 0);
return climb(n);
}
private:
vector<int> f_;
int climb(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
if(f_[n-1] != 0) return f_[n-1];
f_[n-1] = climb(n-1) + climb(n-2);
return f_[n-1];
}
};
采用"三人行",前两个数推第3个数,不需要申请数组空间,空间复杂度O(1)
class Solution {
public:
int climbStairs(int n) {
if(n<=2) return n;
int one = 1;
int two = 2;
int cur;
for(int i=3; i<=n; i++) {
cur = one + two;
one = two;
two = cur;
}
return cur;
}
};