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?
思路:This is a classic Dynamic Programming problem.
Define:
f(n) = number of ways you can climb to the nth step.
To reach to the n
th step, you have only two choices:
- Advance one step from the
n-1
th step. - Advance two steps from the
n-2
th step.
Therefore, f(n) = f(n-1) + f(n-2)
, which is the exact same recurrence formula defined by theFibonacci sequence (with different base cases, though).
Set base cases f(1) = 1
, f(2) = 2
and you are almost done.
一、递归:容易想到,复杂度巨高,大数据会超时
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(n == 1) return 1;
if(n == 2) return 2;
else return climbStairs(n-1) + climbStairs(n-2);
}
};
二、动态规划:记录前两个值,O(1)的空间复杂度,O(n)的时间复杂度
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(n == 1) return 1;
if(n == 2) return 2;
int minus2 = 1;
int minus1 = 2;
for(int i = 2; i < n;i++)
{
int temp = minus1;
minus1 += minus2;
minus2 = temp;
}
return minus1;
}
};
8 milli secs.
三、直接用Fibonacci数的公式计算
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
double s = sqrt(5);
return floor( (pow((s + 1)/2,n+1) - pow((1 - s)/2 ,n+1) )/s+0.5);
}
};
8 milli secs.