这道题第一反应是可以用递归的思想,但是当n增大的时候,递归的效率会很让人抓狂,而且提交的时候会超出时间,无法通过。
思路一是可以用一个vector<int>来解决这个问题,将每次前两者计算加和的结果push_back进去,最后返回这个vector的back()即可,代码如下:
class Solution
{
public:
int climbStairs(int n)
{
vector<int> res {};
for (int i = 0; i < n; i++)
{
if (i == 0 || i == 1)
res.push_back(i+1);
else
res.push_back(res[i-1] + res[i-2]);
}
return res.back();
}
};
但是上述方法的空间复杂度还是可以减小,由O(n)变为O(1),具体代码如下:
class Solution
{
public:
int climbStairs(int n)
{
int first = 1;
int second = 2;
int tmp = 0;
if (n == 1 || n == 2)
{
return n;
}
else
{
for(int i = 0; i < n - 2; i++)
{
tmp = second;
second = first + second;
first = tmp;
}
return second;
}
}
};