1. 程式人生 > 其它 >docker 中配置host_centos8中docker容器網路配置和sshd(二)

docker 中配置host_centos8中docker容器網路配置和sshd(二)

技術標籤:技術

##題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39

思路

  1. 遞迴(函式棧呼叫消耗太高)
    時間複雜度O(2^n),空間複雜度O(n)。

  2. 使用迴圈替換遞迴
    時間複雜度O(n),空間複雜度O(1)。

  3. 動態規劃
    時間複雜度O(n),空間複雜度O(1)。

  4. 矩陣快速冪


    時間複雜度O(lgn),空間複雜度O(1)。

遞迴演算法

public class Solution {
    public int Fibonacci(int n) {
        if(n < 0)    return 0;
        if(n < 2)    return n;
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

迴圈演算法

public class Solution {
    public int Fibonacci(int n) {
        int a = 0, b = 1, c = 1;
        while(n-- > 0) {
            a = b;
            b = c;
            c = a + b;
        }
        return a;
    }
}

動態規劃

public class Solution {
    public int Fibonacci(int n) {
        int[] dp = new int[] {0, 1};
        while(n-- > 0) {
            dp[1] = dp[0] + dp[1];
            dp[0] = dp[1] - dp[0];
        }
        return dp[0];
    }
}

矩陣快速冪

class Solution {
    private int[][] matmul(int[][] a, int[][] b, int m, int n, int t) {
        int[][] tmp = new int[m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                tmp[i][j] = 0;
                for(int k = 0; k < t; k++) {
                    tmp[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        return tmp;
    }
    
    public int Fibonacci(int n){
        if(n < 1)     return 0;
        if(n == 1)    return 1;
        int[][] matT = new int[][] {{1, 1}, {1, 0}};
        int[][] fibT = new int[][] {{1}, {0}};
        while(n > 1){
            // 二進位制轉換,最高位1用最終快速冪矩陣,其餘位1用當前冪矩陣
            if(n%2 == 1){
                fibT = matmul(matT, fibT, 2, 1, 2);
            }
            matT = matmul(matT, matT, 2, 2, 2);
            n /= 2;
        }
        fibT = matmul(matT, fibT, 2, 1, 2);
        return fibT[1][0];
    }
}

簡單快速冪求2的n次方

class Solution {
    public long pow(int n) {
        long ans = 1, base = 2;
        while(n > 0) {
            if(n%2 == 1) {
                ans = (ans * base) % 1000000007;
            }
            base = (base * base) % 1000000007;
            n >>= 1;
        }
        return ans;
    }
}

筆記

1.快速冪餘項的個數聯想二進位制權重
2.迴圈實現,三次賦值,一次加法
dp實現,兩次賦值,一次加法,一次減法
後者效率未見得高
3.尾遞迴優化