【LeetCode70】-爬楼梯

方法一(暴力递归)

实现思路

原问题分解为子问题,子问题就是走一步还是走两步,走一步就多增加一种走法,走两步就增加两种走法

实现代码

一种遍历的写法
void solve(int n){
if(n== 1 || n==2){
return n;
}
return solve(n-1)+solve(n-2);
}
这种情况下的写法之所以没有问题,原因是由于n的最小值一定是1,当为1的时候就会返回,不会出现无限循环的情况
在这里插入图片描述

提交结果

在这里插入图片描述

分析超时的原因:其实走每一步就是相当于有两种选择,要么走一步要么走两步,最终表现成的是一个二叉树形式,时间复杂度趋近于O(2^n)

方法二(递推)

实现思路

在这里插入图片描述
Q&A:
Q:为什么这里的i-2阶的爬法不用考虑两种
A:由于i-2分两步爬的情况实际上就落到了i-1阶的爬法中

实现代码

在这里插入图片描述
注意一下,这里面初始化dp为n+3大小,是为了n为0的情况下也不会报错

提交结果

在这里插入图片描述

总结

递推方法的关键:
(1)初始状态
(2)递推公式
在这里插入图片描述

两方法的对比:
方法一是需要每走一步都看一下两种情况,方法二只需要前续依次推得

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/114680033