看到此题,首先想到的是递归求解,但是题意理解错了,题中是说需要n 步到达山顶,每一次可以是一步或者两步,而我理解的是n次中每一次可以是一步或者两步
错误的递归代码如下
class Solution {
public:
int climbStairs(int n) {
num = 0;
if(n==0)
return num;
climbStairsHelper(n);
return num;
}
void climbStairsHelper(int n)
{
if(n==0)
{
num++;
return;
}
//choose 1 step
climbStairsHelper(n-1);
//choose 2 step
climbStairsHelper(n-1);
}
private:
int num;
};
class Solution {
public:
int climbStairs(int n) {
if(n==0)
return 0;
if(n==1)
return 1;
return climbStairs(n-1)+climbStairs(n-2);
}
};
一般情况下递归算法超时后,可以利用动态规划来解决,保留中间结果
动态规划的代码如下 通过
class Solution {
public:
int climbStairs(int n) {
vector<int> result(n+1, 0);
if(n==0)
return result[n];
result[0] = 1;
result[1] = 1;
for(int i = 2; i <= n; ++i)
result[i] = result[i-1] + result[i-2];
return result[n];
}
};
分析代码注意到,其实每次只用了三个变量
优化后的动态规划代码
class Solution {
public:
int climbStairs(int n) {
if(n==0)
return 0;
int a = 1;
int b = 1;
int c = 1;
for(int i = 2; i <= n; ++i)
{
c = a + b;
a = b;
b = c;
}
return c;
}
};