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?
使用动态规划的方法解决此问题:
位置n 只能由 位置(n- 1)走一步,或者位置 (n - 2)走两步到达,即:
step [n] = step[n-1] + step[n - 2];
1> 方法一:
时间复杂度 O(n);
空间复杂度 0(n);
class Solution {
public:
int climbStairs(int n) {
//step[n] = step[n-1] + step[n -2]
if (n <= 2) {
return n;
}
int *step = new int[n + 1];
step[0] = 0;
step[1] = 1;
step[2] = 2;
for (int i = 3; i <= n; ++i) {
step[i] = step[i -1] + step[i - 2];
}
unsigned int retval = step[n];
delete [] step;
return retval;
}
};
2> 方法2
时间复杂度 : O(n)
空间复杂度 : O(1)
class Solution {
public:
int climbStairs(int n) {
//step[n] = step[n-1] + step[n -2]
if (n <= 2) {
return n;
}
int step_curr = 0; //step[n]
int step_pre = 2; //step[n - 1]
int step_pre_pre = 1; //step[n - 2]
for (int i = 0; i < n - 2; ++i) {
step_curr = step_pre + step_pre_pre;
step_pre_pre = step_pre;
step_pre = step_curr;
}
return step_curr;
}
};