首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

楼梯问题详解

正好今天做题做到了爬楼梯的题目,那我们就借此来说道说道。 我们先来看一下题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶或者3个台阶。...画个图我们就可以很轻易地发现,有重叠子问题,CountWays(2)跟CountWays(1)被调用了两次。说到这个那我可就会了啊,缓存结果啊!?...我们的缓存数组缓存所有子问题的计算结果,我们可以肯定的是不会有超过n+1个子问题, 所以时间复杂度就在O(n),空间复杂度还是没变,还是O(n)。 自下而上 我们还可以用自下而上的方式来尝试优化。...所谓的自下而上很直观,还是看上面那个树形图,可以这么理解,先计算上面的再计算下面的小子问题称之为自上而下。而直接计算下面的子问题从而引导到计算大问题称之为自下而上。...最近我会继续分享一些动态规划相关的问题出来,感谢大家关注。Happy coding~

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

解答牛顿爬楼梯问题

今天面试遇到了这个题,脑子轴了一下, 没有答上来, 事后想了想, 其实也是蛮简单的问题 牛顿爬楼梯.png 爬楼梯一次只能迈一节或二节台阶. 假设一共N节台阶....分析问题的关键: 最后一步迈了几个格子?...如果最后一步迈了一个格子: 前面所有步法的数量为f(N-1) 如果最后一步迈了两个格子: 前面所有步法的数量为f(N-2) """ 一个人一次可以迈过一节楼梯, 或者两节楼梯 问 N节楼梯有多少种走法...分析: 1节楼梯有1种走法 2节楼梯有2种走法 3节楼梯的走法数量 = 2节楼梯的走法数量(最后一次走一步的数量) + 1节楼梯的走法数量(最后一次走两步的数量) N节楼梯的走法数量 = N-1 节楼梯的走法数量...("如果每次迈出1-3个台阶,共有", result_1_2_3, "种走法") if __name__ == '__main__': main() 这里用到了类似斐波那契的递推, 但实际每次的结果取决于一次保存的状态

83360

Python两种方法求解登楼梯问题(京东2016笔试题)

问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明这段楼梯一共有多少种方法?...解析:从第15个台阶往回看,有3种方法可以上来(从第14个台阶一步迈1个台阶上来,从第13个台阶一步迈2个台阶上来,从第12个台阶一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算...然后就是确定这个递归公式的结束条件了,第一个台阶只有1种法,第二个台阶有2种法(一步迈2个台阶上去、一步迈1个台阶分两步上去),第三个台阶有4种法(一步迈3个台阶上去、一步2个台阶+一步1个台阶、...有了公式和结束条件,可以使用递推和递归两种方法来解决这个问题,代码如下: def climbStairs1(n): #递推法 a = 1 b = 2 c = 4 for i...在Python中,可以使用functools标准库提供的缓冲修饰器lru_cache来缓解这个问题。下面的函数和上面的递归函数完全一样,只是在外面加了个缓冲器。

1.8K90

Java笔记(

 高性能 Java最初发展阶段,总是被人诟病“性能低”;客观,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。...业界发展,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。  分布式 Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。...== 但是,并不是说学习了java,以后所有的东西都要用java开发了:某些领域其他语言有更出色的表现,比如,Objective C和后来的Swift在iOS设备就有着无可取代的地位。...扩展:JAVA_HOME环境变量 后续我们会用到一个软件:tomcat,在执行startup.bat的时候会出现闪退问题: 解决: 必须要配置一个环境变量叫:JAVA_HOME 我再次启动才会成功:...很容易被其中的很多概念弄的傻傻分不清楚,首先从概念理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Enviroment)

67610

Java 泛型(

它不是类型安全的(Java 的编译器对于类型转换的错误是检测不到的,在运行时执行到 checkcast这个字节码指令时,如果类型转换错误才会抛出 ClassCastException ),并且要求在检索封装对象时使用显式类型转换...其实泛型也可以看成是 Java 的一种语法糖。...(可以多去看看 Java 集合中是怎么利用泛型的) 怎么用 泛型类 public class GenericClass{ // key 这个成员变量的类型为 T,T 的类型由外部使用时指定...这样我就很方便创建一个数组,其实在底层实现是编译器帮我们去 new 数组这个操作了。 public class GenericTest { // 巧妙利用语言的特性。...看成所有类型的父类来理解(也可以把这个看成 Java 语言的一种规范)。

42531

Java 反射基础(

在之前的文章中,有读者反馈我博客的内容有点长,如果要说长,可能是我习惯于思考,写博客的过程中会带着问题去写,解释我为什么这么想,我是怎么解决的,而不是上来直接说解决方案。...本博文主要记录我学习 Java 反射(reflect)的一点心得,在了解反射之前,您应该先了解 Java 中的 Class 类,如果您不是很了解,可以查看我的另一篇博客《浅谈 Java 的 Class...我理解的 Java 反射机制 参考了许多博文,总结了以下个人观点,如您有更好的看法还望指导: Java 反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性...类的名称:obj.SonClass public java.lang.String mSonBirthday public java.lang.String mFatherName public...类的名称:obj.SonClass private java.lang.String mSonName protected int mSonAge public java.lang.String

54090

Java 面向对象(

前言 学习了面向对象编程的思想,今天就来看看面向对象编程思想在 Java 中的体现 - 类。以及有关类的相关知识,比如属性、方法、引用等。...而在 Java 语言中,属性的命名虽然没有强制规定,但是一般都是有一套大家通用的命名方法,即: 若属性是一个单词组成,那么一般都是小写。 若属性是多个单词组成,那么则采用驼峰法。...关于更多的命名规定,推荐参考阿里巴巴出品的 《Java 开发手册》,下载地址:https://github.com/cunyu1943/ebooks 方法 而除开属性之后,每个对象还能够有许多其他的功能...简单来说,就是在 Java 的一个类中,我们可以创建多个相同名字的方法,但是这些方法之间的参数和返回值有所不同。

18220

java内存管理(

一.简介 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点等等。...二.java内存划分 方法区 (线程共享)  常量  静态变量  JIT(即时编译器)编译后代码也在方法区存放 堆内存(线程共享) 垃圾回收的主要场地 程序计数器  当前线程执行的字节码的位置指示器 Java...虚拟机栈 定义: 描述Java方法运行过程的内存模型 Java虚拟机栈会为每一个即将运行的Java方法创建一块叫做”栈帧”的区域,用于存放该方法运行过程中的一些信息,如  局部变量表  /操作数栈  /...虚拟机栈是线程对应的,数据不是共享的,因此不用关心数据一致性问题,也不会存在同步锁的问题 特点 局部变量表随着栈帧的创建而创建,他的大小在编译时确定,创建时只需分配事先规定的大小即可,在方法运行的过程中...,那么当前线程请求的栈的深度超过当前的Java虚拟机栈的最大深度是,就会抛出此异常 OutOFMemoryError,若允许动态扩展,那么当前线程的请求的栈内存用完了,无法再动态扩展时,抛出此异常 Java

67310
领券