
想法
1.递归调用2.动态规划3.官答里的什么矩阵快速幂代码没太看懂。。斐波那契通项公式没什么意思,码一下前两个吧
1.递归调用 时间复杂度O()
class Solution {
public:
int climbStairs(int n) {
if(n==1)
return 1;
if(n==2)
return 2;
return climbStairs(n-1)+climbStairs(n-2);
}
};
但当输入n为44时,超时,由于时间复杂度过高
优化
可以发现 当考虑n=5时,需要考虑n=4和n=3
而n=4需要考虑n=2,同样的n=3也需要考虑n=2 重复运算使得时间复杂度高
采用记忆化递归 用memo数组记录每次运算的结果 递归时,若已计算此节点的值,则直接调用
class Solution {
public:
int climbStairs(int n) {
int memo[]= new int[n+1]
return climbStairsmemo(n,memo);
}
int climbStairsmemo(int n,int memo)
{
{if(memo[n]>0)
return memo[n];
}
if (n==1)
{memo[n]=1;}
else if(n==2)
{ memo[n]=2;}
else
{
memo[n]=climbStairsmemo[n-1,memo]+climbStairsmemo[n-2,memo];
}
return memo[n];
}
};
2.动态规划
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n+1);
if (n <= 1) return n;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
为了减少空间复杂度 有滚动数组思想
class Solution {
public:
int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
};
ok就酱紫