docker 中配置host_centos8中docker容器網路配置和sshd(二)
阿新 • • 發佈:2021-02-13
技術標籤:技術
##題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39思路
-
遞迴(函式棧呼叫消耗太高)
時間複雜度O(2^n),空間複雜度O(n)。 -
使用迴圈替換遞迴
時間複雜度O(n),空間複雜度O(1)。 -
動態規劃
時間複雜度O(n),空間複雜度O(1)。 -
矩陣快速冪
時間複雜度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.尾遞迴優化