《剑指offer》– 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖

《剑指offer》– 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖

一、斐波那契数列:

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);
		}
        }    

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114701.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java实现xml文件CRUD

    java实现xml文件CRUD

    2021年12月31日
    40
  • vb封装vba代码成exe文件_宏vba安装包

    vb封装vba代码成exe文件_宏vba安装包将ExcelVBA封装成exe程序[老贴收藏]假如您手头已有一xls文档等待封装,假如您机子上已安装有VB6开发系统,那么请跟着往下操作:一、用VB制作EXE文件头部分1、打开VB,“文件”-“新建工程”-“标准EXE”;2、此时会出现名为Form1的默认窗体编辑窗口,Form1将作为软件启动封面窗体,打开该Form1的属性窗口,对如下属性进行设置:BorderStyle=0,…

    2022年10月3日
    0
  • windows server2012 AD域相关操作「建议收藏」

    windows server2012 AD域相关操作「建议收藏」AD域主要作用就是集中管理,限制域内用户或计算机的所有操作,主要管理公司员工,就像通讯录一样,还能管理了电脑,打印机等,权限管理,ADhelper可以实现WEB方式的AD域管理,方便、快捷。其余不懂得还是直接上例子其余自己科普。实操AD域VMA、VMB虚拟机配置为主辅域,域名为szpdc.com; VMA做为GC、SchemaMaster、DomainNamingMa…

    2022年5月17日
    392
  • 基于multisim的语音放大器电路设计

    基于multisim的语音放大器电路设计目录目录 -1-1设计题目及目的 -3-1.1题目 -3-1.2目的 -3-2设计内容 -3-3实验要求 -3-4实验原理 -4-4.1前置放大电路 -4-4.2带通滤波电路 -4-4.3功率放大电路 -4-4.4整体组装电路 -4-5芯片功能及参数介绍 -5-5.1LM324N引脚及功能介绍 -5…

    2022年5月3日
    60
  • Java基础知识面试题(2020最新版)

    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别OracleJDK和OpenJDK的对比基础语法数据类型Java有哪些数据类型switc…

    2022年4月18日
    43
  • 多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」 …[通俗易懂]

    多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」 …[通俗易懂]雷锋网(公众号:雷锋网)AI科技评论按:英国当地时间1月24日,DeepMind在伦敦组织线上直播,向全世界的游戏AI研究人员以及游戏爱好者们介绍自己的AI研发最新进展。参加直播的DeepMind研究人员是DeepMind团队联合研发负责人OriolVinyals和DavidSilver,后者也是Alph…

    2022年6月1日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号