加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++实现 LeetCode-70. Climbing Stairs

发布时间:2020-12-15 04:53:36 所属栏目:百科 来源:网络整理
导读:方法一:递归(缺点:Time Limit Exceeded) 思路:同fibonacci算法,典型的动态规划问题。 1.定义子问题:vec[i]表示跳到第i步可行的不同方式数目。 2.当前子问题vec[i]与前面子问题的关系:如果是用两步跳到当前(第i步),因为这两步已经确定,所以只有ve

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

}

};

? ? ? ? ? ? ? ? ? ? ??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读