斐波那契數列區間和
阿新 • • 發佈:2018-12-25
同事去某團面試,聊到演算法時問了“計算斐波那契數列下標從i到j的和”?
斐波那契數列特點是當前值等於前2位的和, 例如0、1、1、2、3、5、8、13、21等等。
構造斐波那契數列可以使用遞迴或者非遞迴的方法。 設想使用遞迴方式計算下標i、下標j的值, 假設下標i比較小, 那麼計算下標j的值時必然重複遞迴了i, 所以遞迴方法效能比較差。
考慮使用非遞迴方式實現,儘量減少時間和空間複雜度。
思路: 使用for迴圈計算每個下標的值, 並在迴圈內計算和(省去再次for迴圈計算和的步驟)。 因為做了一個for迴圈,所以時間複雜度O(n); 因為new了陣列array,所以空間複雜度O(n)。
/** * 計算斐波那契數列第i位到第j位的和 * @param i,低位下標 * @param j,高位下標 * @return 如果引數非法則返回-1, 如果引數合法則返回和 */ private static int fabonacciSum(int i, int j) { if (i > j || i < 0 || j < 0) { return -1; } if (j < 2) { return j; } int[] array = new int[j+1]; int total; if (i < 2) { //下面的for迴圈是從下標2開始的 total = 1; } else { total = 0; } array[0] = 0; array[1] = 1; for (int k = 2; k <= j; k++) { array[k] = array[k-1] + array[k-2]; if (k >= i) { total += array[k]; } } return total; } public static void main(String[] args) throws Exception { int result = fabonacciSum(1, 2); int result1 = fabonacciSum(5, 8); System.out.println(result + ", " + result1); }
感覺這是最優演算法, 歡迎討論~~~~