剑指offer——斐波那契相关

1.跳台阶

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

public class Solution {
    public int JumpFloor(int target) {

    }
}

  

非递归:

public class Solution {
    public int JumpFloor(int target) {
        if(target == 0) return 0;
        if(target == 1) return 1;
        int[] array = new int[target];
        array[0] = 1;
        array[1] = 2;
        for(int i = 2; i < target; ++i){
            array[i] = array[i - 1] + array[i - 2];
        }
        return array[target - 1];
    }
}

  

递归的:

 

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

  

 

别人的代码:

迭代的:

public class Solution {
    public int JumpFloor(int target) {
        if(target == 1) return 1;
        if(target == 2) return 2;
        int sum = 0;
        int sum1 = 1, sum2 = 2;
        for(int i = 2; i < target; ++i){
            sum = sum1 + sum2;
            sum1 = sum2;
            sum2 = sum;
        }
        return sum;
    }
}

  

递归的

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

  

2.斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

n<=39

迭代

public class Solution {
    public int Fibonacci(int n) {
        if(n == 0) return 0;
        if(n == 1 || n == 2) return 1;
        int sum = 0;
        int sum1 = 1, sum2 = 1;
        for(int i = 3; i <= n; ++i){
            sum = sum1 + sum2;
            sum1 = sum2;
            sum2 = sum;
        }
        return sum;
    }
}

  

3.变态跳台阶

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

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 0 || target == 1) return 1;
        return 2 * JumpFloorII(target - 1);
    }
}

  

 4.矩形覆盖

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

这个首先没思路,但是要先画几个矩形,慢慢试试就有思路了,画着画着就很像青蛙跳台阶,一次可以覆盖一个,或者两个。

 

public class Solution {
    public int NumberOf1(int n) {
        int sum = 0;
        if(n > 0){
            while(n > 0){
                sum += n>>2;
                n /= 2;
            }
        }
        return sum;
    }
}

  

posted @ 2018-03-07 17:23  SkyeAngel  阅读(100)  评论(0编辑  收藏  举报