微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++实现 LeetCode-70. Climbing Stairs

方法一:递归(缺点: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:

int climbStairs(int n) {

if(n == 1 || n == 2){

return n;

}else{

return climbStairs(n-1)+climbStairs(n-2);

}

}

};

方法二:用循环代替递归。递归需要多次调用函数,但本题中只用到前两步的值,因此可以用变量记录,降低其空间复杂度为O(1)。 

 

class Solution {

public:

int climbStairs(int n) {

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 举报,一经查实,本站将立刻删除。

相关推荐