斐波那契数列:
F(0) = 0
F(1) = 1
F(n) = F(n-1)+F(n-2)
LeetCode:
(70)爬楼梯

1. 递归
时间复杂度:O(2^n)
空间复杂度:O(n)
int climbStairs(int n) {
return climb(n);
}
int climb(int n)
{
//终止条件,第一阶为1,第二阶为2
if(n <= 2)
{
return n;
}
//每一阶为前两阶之和
return climb(n-1)+climb(n-2);
}
2. 递归+记忆
时间复杂度:O(n)
空间复杂度:O(n)
vector<int> mem;
int climbStairs(int n) {
mem = vector<int>(n+1,-1);
return climb(n);
}
int climb(int n)
{
//终止条件,第一阶为1,第二阶为2
if(n <= 2)
{
return n;
}
//若缓存中存在则不需重新计算
if(mem[n] == -1)
{
//每一阶为前两阶之和
mem[n] = climb(n-1)+climb(n-2);
}
return mem[n];
}
3. 动态规划(递推法、正推法)
时间复杂度:O(n)
空间复杂度:O(n)
int climbStairs(int n) {
if(n == 1)
return 1;
vector<int> dp = vector<int>(n+1);
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++)
{
//每一阶为前两阶之和
dp[n] = dp[n-1] + dp[n-2];
}
return dp[n];
}
4. 滚动数组
时间复杂度:O(n)
空间复杂度:O(1)
int climbStairs(int n) {
if(n == 1)
return 1;
first = 1;
second = 2;
for(int i = 3; i <= n; i++)
{
//每一阶为前两阶之和
third = first + second;
//滚动
first = second;
second = third;
}
return third;
}
8万+

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



