【剑指Offer】07 - 斐波那契数列

斐波那契数列

时间限制:1秒
空间限制:32768K
本题知识点:递归

题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
public class Solution {
    public int Fibonacci(int n) {

    }
}
解法一:
/**
 * 暴力递归法(性能超级差,谁试谁知道)
 */
public class Solution {
    
    public int Fibonacci(int n) {
        
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}
解法二:
/**
 * 备忘录法 自顶而下,在树的多路归并时有较好的效果
 */
public class Solution {
    
    int[] array = new int[40];
    
    public int Fibonacci(int n) {
        
        array[0] = 0;
        array[1] = 1;
        array[2] = 1;
        
        if(n == 0){
            return 0;
        }
        if(n == 1 || n == 2){
            return 1;
        }

        int result = memo(n);
        return result;
    }
    
    public int memo(int n){
        if(array[n-2] == 0){
            array[n-2] = memo(n-2);
        }
        
        if(array[n-1] == 0){
            array[n-1] = memo(n-1);
        }
        
        return array[n-2] + array[n-1];
    }
}
解法三:
/**
 * n 的值较小,因此可以直接将数组求出后,查找对应的 n 值
 */
public class Solution {
    
    public int Fibonacci(int n) {
        int[] array = new int[40];
        array[0] = 0;
        array[1] = 1;
        for(int i=2; i<40; i++){
            array[i] = array[i-1] + array[i-2];
        }
        return array[n];
    }
}
解法四:
/**
 * 动态维护 i 和 j 两个值,根据 n 的值返回靠前的 i
 */
public class Solution {
    
    public int Fibonacci(int n) {
        int i = 0;
        int j = 1;
        int tmp;
        while((n--)>0){
            tmp = j;
            j += i;
            i = tmp;
        }
        return i;
    }
}

猜你喜欢

转载自www.cnblogs.com/jianminglin/p/11361170.html