首页 > 编程语言 >leetcode-70 爬楼梯(java实现)

leetcode-70 爬楼梯(java实现)

时间:2023-06-13 15:06:04浏览次数:41  
标签:java 递归 int 复杂度 到达 70 楼梯 leetcode dp



爬楼梯

  • 题目
  • 分析1 递归写法
  • 动态规划解法


题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

分析1 递归写法

如果要爬上第n阶,要么是从第n-1上面再爬1阶上去的,要么是从n-2上面再爬2阶上去的,那么我们就可以想到 f(n) = f(n-1)+f(n-2),这样也就很容易利用递归写出来

public static int climbStairs(int n) {

        // 这个貌似也是要用到递归,把之前的n-1个台阶的步骤全部加起来就可以了
        if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else{
            return climbStairs(n-1)+climbStairs(n-2);
        }
    }

递归树的高度为n,每个节点有2个子节点,所以总共需要计算的节点数为2的n次方。因此,时间复杂度为O(2^n)
空间复杂度也比较高,因为每个递归函数调用都会创建一个新的栈帧,占用一定的内存。递归树的深度为n,所以空间复杂度为O(n)。

提交后,leetcode 平台提示运行失败,超时了

leetcode-70 爬楼梯(java实现)_leetcode


本地是能正常输出的,写法和思路是没有问题的,不过确实慢

leetcode-70 爬楼梯(java实现)_数据结构_02

动态规划解法

假设到达第i个楼梯的不同方法数为dp[i],则有以下递推式:

dp[i] = dp[i-1] + dp[i-2]

因为每次只能爬1个或2个楼梯,所以到达第i个楼梯的方法数等于到达第i-1个楼梯的方法数加上到达第i-2个楼梯的方法数。

初始状态为dp[1]=1和dp[2]=2,因为到达第1个楼梯只有1种方法,到达第2个楼梯有2种方法(一次跨2个或者分两次跨1个)。

最终要求的答案是到达第n个楼梯的方法数,即dp[n]。

public int climbStairs(int n) {
    if (n == 1) return 1;
    // 当需要计算到 dp[n] 时,数组下标是从 0 到 n 的,需要定义一个长度为 n+1 的数组才能存储计算结果。如果定义一个长度为 n 的数组,那么在计算 dp[n] 的时候,就会发生数组越界的错误
    int[] dp = new int[n+1];
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= n; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}

时间复杂度为O(n),空间复杂度为O(n)。

提交后的结果成功

leetcode-70 爬楼梯(java实现)_算法_03


标签:java,递归,int,复杂度,到达,70,楼梯,leetcode,dp
From: https://blog.51cto.com/u_16159391/6470204

相关文章

  • java 长度为2 for循环只循环了一次
    上代码for(Map<String,Object>user:userList){ for(TSBrOrderDetailRepairmanVOrepairmanVO:repairmanVOList){ if(user.get("id").toString().equals(repairmanVO.getUId())){ userList.remove(user); } }}这里的userList的长度是2,但循环的话只循环了一次在Java中,当......
  • leetcode 104. 二叉树的最大深度(java实现)
    104.二叉树的最大深度标题解法标题给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。解法publicclassSolution{publicintmaxDepth(TreeNoderoot){//如果节点为空,返回深度为0......
  • Java反射(Class类)常用方法(附Xmind整理)
    文章目录一、类加载器1、Java类加载机制2、ClassLoader类加载器二、获取Class对象的方式1、Class.forName("全类名")2、类名.class3、对象.getClass()三、常用方法:1、获取构造方法、成员方法、成员变量(公开的public)2、获取构造方法、成员方法、成员变量(所有的public+private)3......
  • java垃圾回收(GC)机制
    一、为什么要进行垃圾回收?因为内存的容量是有限的。二、如果判断一个对象需要回收?1、引用计数算法:给每个对象中加一个引用计数器。每增加一个引用,计数器就+1。当计数器为0时,代表没有引用。因为有循环引用的存在,所以java虚拟机不再使用引用计数算法。2、可达性分析算法:通过GCR......
  • java如何往List<? extends number>中加入元素?体会范型集合父子关系以及范型通配符的使用
    以下来自一个stackoverflow的一个问答,写的很清楚。基本上就是子类集合的引用付给父类引用,如果父类的引用变量声明的是<?extendsParent>,则父类引用变量只能对集合进行读操作,读出来的变量是Parent类型,这是因为不确定该父类引用变量指向的是什么类型的集合,可以是Child1,也可以C......
  • Java:如何写好代码,少点bug
    前言工作差不多两年了。2021-04-14实习入职,至今2023-04-07,和大佬相比我这还是属于初级程序员,技术不强。平时写代码没啥技术含量,但真的挺多同事连基本的CRUD都写不好,不管是代码规范还是安全性问题都有很大的纰漏,所以觉得自己最大的骄傲就是代码规范,bug少。同时希望刚工作不久的......
  • java 泛型 深入
    评:泛型的好处:(casting)的绝对无误。/*******不使用泛型类型*******/Listlist1=newArrayList();list1.add(8080);//编译器不检查值String......
  • [LeetCode] 2475. Number of Unequal Triplets in Array
    Youaregivena 0-indexed arrayofpositiveintegers nums.Findthenumberoftriplets (i,j,k) thatmeetthefollowingconditions:0<=i<j<k<nums.lengthnums[i], nums[j],and nums[k] are pairwisedistinct.Inotherwords, nums[i]!=......
  • 【技术积累】JavaSciprt中的函数【一】
    什么是函数?如何声明函数?JavaScript中的函数是一段可重复使用的代码块,它可以接受输入并返回输出。在JavaScript中,函数是一种特殊的对象,因此可以将其存储在变量中,将其作为参数传递给其他函数,并从其他函数中返回。在JavaScript中,声明函数有两种方式:函数声明和函数表达式。1.函数......
  • Java8 Stream List Map:Stream 流对象汇总 求和 某个属性 BigDecimal MDouble
    测试实体(数字对象使用MDouble):importcom.mchweb.common.lang.MDouble;importlombok.*;@Getter@Setter@Builder(toBuilder=true)@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateMDoublemoney;}importcom.mchweb.common.lang.MDouble;imp......