当前位置:网站首页>力扣刷题之爬楼梯(7/30)
力扣刷题之爬楼梯(7/30)
2022-07-31 01:47:00 【兰舟千帆】
力扣刷题之爬楼梯
题目如下
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
这道题的要求的话是很清晰的,也就是我们一步楼梯可以有两种走法,就是一次一层还有就是一次两层。上一层的当然只有一种,然后上两层的话有两种,就是一步一步,或者一次性走两层。上三层的话的方法就是走一层和走两层的方法的和。这个只体现的方法的数量上。
第n个层可以从n-1一步到达,也可以从n-2采用两种方法到达。
所以呢!可以列出一个方法的函数表达式
f(n)= f(n-1)+f(n-2)。这样就确定了一个递推的公式,我们可以递归去计算,但是要考虑递归的出口,当n等于2的时候需要去直接给定一个值为2,因为计算f(0)是不合理的,所以我们这样去考虑了。
我们可以首先这样去做,是这样的一个逻辑
package leetcode;
/** * @author 兰舟千帆 * @version 1.0 * @date 2022/7/30 9:37 */
public class CommonFactor {
public static void main(String[] args) {
int n = 10;
function_count(n);
}
public static int function_count(int n)
{
if (n==1||n==2)
{
return n;
}
return function_count(n-1)+function_count(n-2);
}
}
但是放在力扣的话,运行的话。
这样的话,力扣这里测试的话,就狐疑超出时间的限制。因为递归是比较消耗时间的。
其实可以思考一下,我们的递归简单的有没有去优化的方法,可以这样去思考一个问题,比如我们计算从第一层到第五层的方法数,我们需要在递归里面用f(4)+f(3),然后这两层就一直递归到借宿条件,所以这里存在重复的计算
f(4)=f(3)+f(2)
f(3)=f(2)+f(1)
对于这里我们可以这样去想,如果f(4)中通已经递归计算出f(3),那么我们就就没有必要再去计算f(3)了,我们直接去用已经计算出的这个结果不就行了?为什么还有去算呢?我们这样去优化,众所周知,HashMap不允许重复的键。
于是呢,我们可以这样去写
class Solution {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
public int climbStairs(int n) {
if(n==1||n==2)
{
return n;
}
else if(null!=map.get(n)){
return map.get(n);
}else{
int result = climbStairs(n-1)+climbStairs(n-2);
map.put(n,result);
return result;
}
}
}
这样优化的递归毫不逊色。
上面这两种方法的话,本质上还是递归。递归的话,你可以去想象为一颗树,我们从树的根乡下对孩子和叶子进行遍历处理,最后再返回结果。这是一种至顶向下的方法。
我们可以采用至底向上累加的方法
class Solution {
public int climbStairs(int n) {
// Map<Integer,Integer> map = new HashMap<Integer,Integer>();
// if(n==1||n==2)
// {
// return n;
// }
// else if(null!=map.get(n)){
// return map.get(n);
// }else{
// int result = climbStairs(n-1)+climbStairs(n-2);
// map.put(n,result);
// return result;
// }
int result =0;
int n1 =2;
int n2 =1;
if (n==1||n==2)
{
return n;
}
for(int i=3;i<=n;i++)
{
result = n1+n2;
n2 = n1;
n1 = result;
}
return result;
}
}
其实它很类似于反向的递归,但是这种方法比递归还好理解,非常的巧妙。
其实就类似于这样的树。最底部的就是1,2,然后依次累计上去,同时for循环里面存在一个复制和交换,这样就可以认为在B已经累加出来后,同时又指定了c,但是c的值我们已经计算出来了,就是上一个result返回的结果。依次类推。
但是力扣的解题大神总是出乎意料的牛逼,不过在牛逼的基础上其实还是懂得更多。
然后他就一直计算下去了,我打赌,他之前的方法一定是超时了,所以才这样去超出三界的方式去解题了。秀。
边栏推荐
猜你喜欢
VSCode插件:嵌套注释
TiDB 在多点数字化零售场景下的应用
1.非类型模板参数 2.模板的特化 3.继承讲解
ROS Action communication
数字图像隐写术之JPEG 隐写分析
【微信小程序】一文带你了解数据绑定、事件绑定以及事件传参、数据同步
rpm安装postgresql12
Analyze the capabilities and scenarios of the cloud native message flow system Apache Pulsar
MySQL installation tutorial (detailed, package teaching package~)
Crypto Life, a day in the life of a Web3 project partner
随机推荐
934. 最短的桥
16、注册中心-consul
有没有可以做副业可以日入300元方法?
C语言_结构体指针数组函数选票系统
MySQL的安装教程(嗷嗷详细,包教包会~)
Know what DTU is 4GDTU equipment
软件测试基础接口测试-入门Jmeter,你要注意这些事
Teach you how to configure Jenkins automated email notifications
最高月薪20K?平均薪资近万...在华为子公司工作是什么体验?
计算S=a+aa+…+aa…a
Word 表格跨页,仍然显示标题
聚簇索引和非聚簇索引到底有什么区别
leetcode-128:最长连续序列
手把手教你配置Jenkins自动化邮件通知
pycharm cannot run after renaming (error: can't open file...No such file or directory)
"Cloud native's master, master and vulgar skills" - 2022 National New College Entrance Examination Volume I Composition
uniapp uses 3rd party fonts
充电效果模拟
Set the browser scrollbar style
pc端判断当前使用浏览器类型