菲波那切數列(Fibonacci Number)

什麼是菲波那切數列?本身google一下,面試題裏面常常遇到,考試遞歸算法用的。面試

在菲波那切數列中用遞歸不太好。第三種算法最好。算法

第一 遞歸算法最差了,不想說。測試一下,當N=6000時,半天出不來數據,有想砸電腦的衝動。數組

第二 數組 在N變大後,空間浪費嚴重。測試

第三 隊列 最好 只使用2個隊列的空間,時間複雜度O(1) 常數級。google

 

1 遞歸算法 最差的算法 也是比較經典的 得會
class Solution {
    public int fib(int N) {
        if(N==1){
            return 1;
        }
        if(N<=0){
            return 0;
        }
        return fib(N-1)+fib(N-2);
    }
}

 

2 使用數組 time:O(n)   space:O(n)
class Solution {
    public int fib(int N) {
        if(N<=0){
            return 0;
        }
        if(N<2){
            return 1;
        }
        int[] nums=new int[N+1];
        nums[0]=0;
        nums[1]=1;
        for(int i=2;i<N+1;i++){
            nums[i]=nums[i-1]+nums[i-2];
        }
        return nums[N];
    }
 
}

3. 使用隊列 先進先出 time:O(n)   space:O(1)

class Solution {
    public int fib(int N) {
        if(N<=0){
            return 0;
        }
        if(N<2){
            return 1;
        }
        Queue<Integer> queue=new LinkedList<>();
        queue.offer(0);
        queue.offer(1);
        for(int i=2;i<N;i++){
            queue.offer(queue.poll()+queue.peek()); 
        }
        return queue.poll()+queue.poll();
    }
}
相關文章
相關標籤/搜索