《剑指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);
		}
        }    

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android 自定义 ViewPager 打造千变万化的图片切换效果

    Android 自定义 ViewPager 打造千变万化的图片切换效果转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开始让ViewPager来做。时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如

  • 自整定pid的控制算法_模糊pid控制算法讲解

    自整定pid的控制算法_模糊pid控制算法讲解一、PID控制算法PID是比例、积分、微分的简称,PID控制的难点不是编程,而是控制器的参数整定。参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解。阅读本

  • 2008秋-计算机软件基础-多关键字排序

    2008秋-计算机软件基础-多关键字排序

  • web添加图片的代码_html保存图片到本地

    web添加图片的代码_html保存图片到本地其实很简单,格式如下:<imgsrc=”data:image/jpg;base64,具体的编码值”/>支持的类型有:data:,文本数据data:text/plain,文本数据data:text/css,CSS代码data:text/css;base64,base64编码的CSS代码data:text/javascript,Javas…

    2022年10月19日
  • ubuntu更新源[通俗易懂]

    ubuntu更新源[通俗易懂]http://blog.csdn.net/pangchengyong0724/article/details/52452878http://blog.csdn.net/wangweiqiang1325/article/details/53447123texiao转载请注明出处转载请注明出处转载请注明出处在输入sudoapt-getupdate出现暂时不

  • 激光雷达(二)——三角测距法和TOF原理

    激光雷达(二)——三角测距法和TOF原理对于市面上的主流激光雷达,主要是用于环境探测、地图构建,按技术路线可分为:三角测距激光雷达,TOF激光雷达。三角测距激光雷达原理三角法的原理如下图所示,激光器发射激光,在照射到物体后,反射光由线性CCD接收,由于激光器和探测器间隔了一段距离,所以依照光学路径,不同距离的物体将会成像在CCD上不同的位置。按照三角公式进行计算,就能推导出被测物体的距离。CCD是ChargeCoupled…

发表回复

您的电子邮箱地址不会被公开。

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