力扣 leetcode70. 爬楼梯C++三种方法实现优化
class Solution {
public:
int climbStairs(int n) {
//我们假设现在在第n个台阶上 那么其前一步一共有两种可能
//1. 在第n-1级台阶上
//2. 在第n-2级台阶上
//方法1 递归 初始为dp[1] = 1 dp[2] = 2; 该方法由于需要计算重复信息 会导致超时
// if(n <= 2)
// {
// return n;
// }
// return climbStairs(n-1) + climbStairs(n-2);
//法2
// if(n <= 2)
// {
// return n;
// }
// vector<int> ret(n, 0);
// ret[0] = 1;
// ret[1] = 2;
// for(int i = 2; i < n; ++i)
// {
// ret[i] = ret[i-1] + ret[i-2];
// }
// return ret[n-1];
//该方法可以通过 但会有O(n)的空间复杂度 我们观察数组可知在求解过程中我们仅仅只使用了前面两位数字
//可以再进行优化
//法3
int a = 1;
int b = 2;
if(n <= 2)
{
return n;
}
for(int i = 2; i < n; ++i)
{
int tmp = a + b;
a = b;
b = tmp;
}
return b;
}
};
当解决了这道题目可以回头看一下斐波那契数列两道题目原理相通