方法一:递归(缺点:Time Limit Exceeded)
思路:同fibonacci算法,典型的动态规划问题。
1.定义子问题:vec[i]表示跳到第i步可行的不同方式数目。
2.当前子问题vec[i]与前面子问题的关系:如果是用两步跳到当前(第i步),因为这两步已经确定,所以只有vec[i-2]种方法,即vec[i]=vec[i-2];
如果使用一步跳到当前,因为这一步已经确定,所以只有vec[i-1]种方法,即vec[i]=vec[i-1]。
3.i==1或i==2时,vec[i]=i;i>2时,vec[i]=vec[i-1]+vec[i-2]。
4.时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
if(n == 1 || n == 2){
return n;
}else{
return climbStairs(n-1)+climbStairs(n-2);
}
}
};
方法二:用循环代替递归。递归需要多次调用原函数,但本题中只用到前两步的值,因此可以用变量记录,降低其空间复杂度为O(1)。
class Solution {
public:
int result = 0;
int num1 = 0;
int num2 = 1;
for(int i=1;i<=n;++i){
result = num1+num2;
num1 = num2;
num2 = result;
}
return result;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。