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
有 f(n) = f(n - 1) + f(n - 2)
方法一:迭代,时间复杂度 O(n),空间复杂度 O(1)
class Solution
{
public:
int climbStairs(int n)
{
int prev = 0;
int cur = 1;
for (int i = 1; i <= n; ++i)
{
int tmp = cur;
cur += prev;
prev = tmp;
}
return cur;
}
};
方法二:数学公式,根据斐波那契数列的通项公式,时间复杂度 O(1),空间复杂度 O(1)
class Solution
{
public:
int climbStairs(int n)
{
const double s = sqrt(5);
return floor((pow((1 + s) / 2, n + 1) + pow((1 - s) / 2, n + 1)) / s + 0.5);
}
};