这是力扣上的一题简单题目,可以用多种方法写出来。
方法1:递归
class Solution {
public:
int climbStairs(int n) {
if(n==1)
return 1;
if(n==2)
retutn 2;
return climbStairs(n-1)+climbStairs(n-2);
}
};
时间复杂度O(2^n),空间复杂度O(n)
这种方法超时了
方法2:动态规划
思路:用dp[i-1]+dp[i-2]记录前两次要用的方法,使时间复杂度降到o(n)
class Solution {
public:
int climbStairs(int n) {
if(n==1 || n==2)
return n;
vector<int> dp(n,0);
dp[0]=1;
dp[1]=2;
for(int i=2;i<n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n-1];
}
};
时间复杂度O(n),空间复杂度O(1)
方法3: 斐波那契数列+滚动数组
思路:1级台阶1种方法,2级台阶2种方法,3级台阶3种方法,可推出4级台阶5种方法(1+1+1+1或2+1+1或1+2+1或1+1+2或2+2),从而可推断出从3级台阶开始,后面每一级爬台阶的方法都是前两个爬台阶方法之和,推断出递推关系式:F(x)=F(x−1)+F(x−2),F(1)=1,F(2)=2,F(3)=5…就是一个斐波那契数列。以下是代码
class Solution {
public:
int climbStairs(int n) { //斐波那契数列+滚动数组
if(n==1)
return 1;
int first=1,second=2;
int third;
for(int i=3;i<=n;i++)
{
third=first+second;
first=second;
second=third;
}
return second;
}
};
时间复杂度O(n),空间复杂度O(1)
更多的解题方法见官方题解:https://leetcode-cn.com/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode-solution/
日拱一卒,功不唐捐!