前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《剑指offer》– 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖

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

作者头像
全栈程序员站长
发布2021-09-29 14:48:26
3290
发布2021-09-29 14:48:26
举报
文章被收录于专栏:全栈程序员必看

一、斐波那契数列:

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

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

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

3、解题思路:

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

4、代码实现:

代码语言:javascript
复制
	 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、代码实现:

代码语言:javascript
复制
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、代码实现:

代码语言:javascript
复制
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、代码实现:

代码语言:javascript
复制
        //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.cn/114701.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、斐波那契数列:
  • 二、跳台阶问题:
  • 三、变态跳台阶问题:
  • 四、矩阵覆盖:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档