一、斐波那契数列:

1、题目:
现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39。

2、什么是斐波那契数列?

斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ……,可以观察到,从第3个数开始,每个数的值都等于前连个数之和。

3、解题思路:

这里可以使用递归的方法实现,但是递归的方式的时间复杂是输入规模的指数级别,不建议使用,因此这里采用迭代的方法实现。

4、代码实现:

  public static int Fibonacci(int n) {if(n<=0){return 0;}int first,second,result;first=0;second=1;result=1;if(n==1){return n;}      for(int i=2;i<=n;i++){result=first+second;first=second;second=result;}       return result;}

二、跳台阶问题:

1、题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

2、解题思路:

(1)可以考虑,小青蛙每一步跳跃只有两种选择:一是再跳一级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-1 级阶梯;或者再跳两级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-2 级阶梯。

(2)于是,i级阶梯的跳法总和f(i)依赖于前 i-1 级阶梯的跳法总数f(i-1)和前 i-2 级阶梯的跳法总数f(i-2)。因为只有两种可能性,所以,f(i)=f(i-1)+f(i-2);

(3)通过上面的分析,我们可以很清晰地看到,这其实就是一个Fibonacci数列。

3、代码实现:

public int JumpFloor(int target) {if(target<1){return 0;}else if(target<2){return target;}else{int first=0,second=1,result=1;for(int i=2;i<=target;i++){first=second;second=result;result=first+second;}return result;}      }

三、变态跳台阶问题:

本部分参考博客:https://blog.csdn.net/friendbkf/article/details/50060239

1、题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

2、问题分析:

分析:用Fib(n)表示跳上n阶台阶的跳法数。如果按照定义,Fib(0)肯定需要为0,否则没有意义。但是我们设定Fib(0) = 1;n = 0是特殊情况,通过下面的分析就会知道,强制令Fib(0) = 1很有好处。ps. Fib(0)等于几都不影响我们解题,但是会影响我们下面的分析理解。

当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;

当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2)  = 2;

到这里为止,和普通跳台阶是一样的。

当n = 3 时,有三种跳的方式,第一次跳出一阶后,对应Fib(3-1)种跳法; 第一次跳出二阶后,对应Fib(3-2)种跳法;第一次跳出三阶后,只有这一种跳法。Fib(3) = Fib(2) + Fib(1)+ 1 = Fib(2) + Fib(1) + Fib(0) = 4;

当n = 4时,有四种方式:第一次跳出一阶,对应Fib(4-1)种跳法;第一次跳出二阶,对应Fib(4-2)种跳法;第一次跳出三阶,对应Fib(4-3)种跳法;第一次跳出四阶,只有这一种跳法。所以,Fib(4) = Fib(4-1) + Fib(4-2) + Fib(4-3) + 1 = Fib(4-1) + Fib(4-2) + Fib(4-3) + Fib(4-4) 种跳法。

当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法..........................第一次跳出n阶后,后面还有 Fib(n-n)中跳法。Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n) = Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)。

通过上述分析,我们就得到了通项公式:

Fib(n) =  Fib(0)+Fib(1)+Fib(2)+.......+ Fib(n-2) + Fib(n-1)

因此,有 Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)

两式相减得:Fib(n)-Fib(n-1) = Fib(n-1)         =====》  Fib(n) = 2*Fib(n-1)     n >= 3

这就是我们需要的递推公式:Fib(n) = 2*Fib(n-1)     n >= 3

3、代码实现:

public static int JumpFloorII(int target) {if(target<=0){return 0;}else if(target<3){return target;}else{Integer[] array = new Integer[target+1];array[0]=1;array[1]=1;array[2]=2;for(int i=3;i<=target;i++){array[i]=2*array[i-1];}return array[target];}}

四、矩阵覆盖:

1、题目:

可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

2、思路:

思路:  对于n>=3的情况, 不管前面矩形是怎样覆盖的。我们只考虑最后一次怎么覆盖。
最后一次只有两种覆盖方式:1.用1个小矩形竖着覆盖。2.用两个小矩形横着覆盖。
所以总的方法数无外乎-->你用各种方法覆盖到只剩1个再竖着覆盖或者你用各种方法覆盖到只剩两个再横着覆盖。
即:总的方法数F(n) = n-1次的方法数F(n-1)(接着用一个小矩形竖着覆盖) + n-2次的方法数F(n-2)(接着用两个小矩形横着覆盖)

3、代码实现:

        //4.2迭代方式实现:public int RectCover(int target) {if(target==0 || target==1 || target==2){return target;}else{int first=1,second=2,result=0;for(int i=3;i<=target;i++){result=first+second;first=second;second=result;}return result;}}//4.1递归方式public int RectCover1(int target) {if(target==0 || target==1 || target==2){return target;}else{return RectCover1(target-1)*RectCover1(target-2);}}    

《剑指offer》-- 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖相关推荐

  1. [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)

    剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...

  2. 剑指Offer——斐波那契数列

    1.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 2.代码实现 1 package com.baozi.offer; ...

  3. 剑指Offer 斐波那契数列

    时间限制:1秒 空间限制:32768K 热度指数:332130 算法知识视频讲解 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 给出代码: ...

  4. c语言斐波那契数列_剑指Offer-10-I.斐波那契数列

    题目 题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...

  5. 剑指Offer_07_斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39. 解题思路 利用递归求解,动态规划保存已求值的结果,提高效率. 利用循环,每次根据保存和前两 ...

  6. 2021-09-22剑指offer07.斐波那契数列

    对于 < 2的数字,直接返回其本身即可. 对于 >=2的数字,取0,0,1作为循环开始最初的数字,每次循环得到的数字分别为1,2,3,5 因此每个数字循环的次数为当前的数字-1.

  7. 剑指offer 菲波那切数列

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 解决方案,递归和迭代: public class Solution {public int Fibon ...

  8. 经典算法(6)斐波拉契数列、兔子繁殖、跳台阶算法

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  9. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  10. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

最新文章

  1. 3.7 感知器-机器学习笔记-斯坦福吴恩达教授
  2. Python类继承简单实现
  3. QT教程2:QT5的体系构架
  4. yamlcpp遍历_OpenCV文件输入和输出使用XML和YAML文件
  5. poj 2778 AC自动机+矩阵快速幂
  6. UGUI_忽略UI被拦截事件
  7. java迭代器用途_各位JAVA前辈,迭代器使用报错。
  8. keras——基于神经网络的风格迁移生成艺术字
  9. 要来了!国内安卓统一推送标准将于3月开启测试
  10. 并发设计模式之Master-Worker模式
  11. C#中 JSON 序列化 与 反序列化
  12. ubuntu16.04系统下配置caffe的GPU环境,训练mobileNet-SSD并在EAIDK-310嵌入式上推理
  13. oracle导出dmp文件合集
  14. Guava学习之Splitter
  15. git提交代码失败 ‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij������������ļ��� 解决方法
  16. python 经典ppt_Python处理PPT文件的实用姿势
  17. e.pageX、e.clientX、e.screenX、e.offsetX的区别以及元素的一些CSS属性
  18. 弘辽科技:淘宝宝贝上下架有哪些规则?该如何优化?
  19. Python请求HTTPS证书错误
  20. IDM 下载器 使用记录

热门文章

  1. 四十五、Gtihub+Hexo+icarus搭建自己的博客
  2. 申请补办 CET(纸笔考试)成绩证明的方法
  3. 泛化性乱弹:从随机噪声、梯度惩罚到虚拟对抗训练
  4. ICLR 2020 | GAN是否真的判断出了数据的真假?
  5. python读取只读word只读_Python用于NLP :处理文本和PDF文件
  6. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用
  7. Nosql数据库的四大分类
  8. python平稳性检验_Python数据分析0.3 用statsmodels进行ADF平稳性检验
  9. 实验2 递归和分治法(二分查找)
  10. Spring Boot简介