假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
解题思路:
n=1时,方法有1种
n=2时,方法有2种
n=3时,方法有3种
n=4时,方法有5种
可得递推式F(n) = F(n-1) + F(n-2),类似于斐波那契数列。
解法一:递归,这个递交显示超出时间限制
时间复杂度O(2n),空间复杂度O(n)
int climbStairs(int n) {
if (n == 1)
{
return 1;
}
else if (n == 2)
{
return 2;
}
else
{
return climbStairs(n - 1) + climbStairs(n-2);
}
}
解法二:动态规划
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int i;
int *result = new int[n];
result[0] = 1;
result[1] = 2;
for(i = 2; i < n; i++){
result[i] = result[i - 1] + result[i - 2];
}
int way = result[n - 1];
delete[] result;
return way;
}
};
解法三:滚动数组:
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
int climbStairs(int n) {
if(n == 0 ||n == 1) return 1;
int step0 = 1;
int step1 = 1;
int step;
for (int i = 2; i <= n; i++){
step = step0 + step1;
step0 = step1;
step1 = step;
}
return step;
}
};
本文探讨了经典的爬楼梯问题,给出了三种不同算法的解决方案,包括递归、动态规划和滚动数组方法,详细分析了每种方法的时间和空间复杂度。
492

被折叠的 条评论
为什么被折叠?



