剑指offer刷题:跳台阶和斐波那契数列

一、斐波那契数列(非递归版)

1.题目

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39

2.思路

斐波那契数列的特征

F(n) = F(n-1) + F(n-2)

3.代码

非递归版

public class Solution {
    public int Fibonacci(int n) {
       if(n<2){return n;}        //前两项较特殊,单独考虑
       int pre = 1;                //前值
       int prePre = 0;            //前前值
       int result = 0;            //最后结果
       for(int i=1;i<n;i++){            //说明n>=2,那么i从1开始
           result = pre + prePre;
           prePre = pre;
           pre = result;
       }
       return result;
    }
}

二、跳台阶(斐波那契数列的递归版)

1.题目

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

2.思路

由题意,青蛙若想跳到第n级。只能从第n-1或第n-2级台阶跳上来。

因此满足斐波那契数列的特征:

F(n) = F(n-1) + F(n-2)

3.代码

public class Solution {
    public int JumpFloor(int target) {
        int res = 0;
        if(target == 1)
            return 1;
        else if(target == 2)
            return 2;
        else
            res = JumpFloor(target-1) + JumpFloor(target-2);
        return res;
    }
}

在这里插入图片描述
哈哈哈,递归版的效率果然不行。毕竟要不停压栈嘛。

三、变态跳台阶

1.题目

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

2.思路

(1)第二题的思路
由题意,青蛙若想跳到第n级。能从第n-1或第n-2级或…第1级台阶跳上来。
故满足表达式

F(n) = F(n-1) + F(n-2) + F(n-3)....+ F(2) + F(1)

(2)简化
每个台阶可以看作一块木板,让青蛙跳上去,n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有存在和不存在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果。

所要求的序列为:0,1,2,4,8,16,……
所以除了第一位外,其他位的数都是前一位的数去乘以2所得到的积。

1<<n和2n等价

3.代码

(1)第二题的思路

public class Solution {
    public int JumpFloorII(int target) {
        if(target < 2){return target;}        //特殊情况
         int result = 1;      //这一次代表直接从0跳到第n级台阶 
        while(target>0){
            result += JumpFloorII(--target);
        }
        //boolean temp = ((target>=0) && (result+=JumpFloorII(target-1))>0);
        return result;
    }
}

(2)简化

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 0){return 0;}
       return 1<<--target;        //1<<n和2^n^等价
    }
}

四、矩形覆盖

1.题目

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

2.思路

在这里插入图片描述
因此满足斐波那契数列的特征:

F(n) = F(n-1) + F(n-2)

3.代码

public class Solution {
    public int RectCover(int target) {
        if(target < 3){return target;}
        int result = 0;
        result = RectCover(target-1) + RectCover(target-2);    
        return result;
    }
}

4.拓展到用2*m的矩形覆盖

相应的结论:
(11 * 3方块 覆 盖3*n区域:f(n) = f(n-1) + f(n - 3)(n > 3)21 *4 方块 覆 盖4*n区域:f(n) = f(n-1) + f(n - 4)(n > 4)
更一般的结论,如果用1*m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m)(n > m)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值