1.斐波那契數列問題
題目:求斐波那契數列的第n項
寫一個函數,輸入n,求斐波那契(Fibonacci)數列的第n項
斐波那契數列的定義如下:
┌ 0 , n = 0
f(n)= ├ 1 , n = 1
└ f(n-1) + f(n-2) , n > 1
0,1,1,2,3,5,8,13…
思路
函數本身是遞歸定義,直接用遞歸方式編寫代碼,在遞歸樹中可以得知,這個過程中出現很多重復節點,時間復雜度是指數級。因此不實用。
比較好的思路是從底向上計算f(n),保留兩個下層函數f(n-1) , f(n-2)的值用于下輪計算。
實現如下:
public static int Fibonacci(int n) {
if(n <= 0)
return 0;
if(n == 1)
return 1;
int fibNumOne= 0;
int fibNumTwo= 1;
int fib = 0;
for(int i = 2; i <= n; ++i) {
fib = fibNumOne + fibNumTwo;
fibNumOne= fibNumTwo;
fibNumTwo= fib;
}
return fib;
}
2.跳臺階問題
題目
一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思路
很明顯的求斐波那契數列類型的題目
當跳n級臺階的時候,設跳法有f(n)種
青蛙的第一步,可以跳1級,也可以跳2級(只有這兩種選擇)
- 當跳1級的時候,剩下的有f(n-1)種
- 當跳2級的時候,剩下的有f(n-2)種
因此, f(0) = 0, f(1) = 1, f(2) = 2, f(n) = f(n-1) + f(n-2)
3.變態跳臺階問題
題目
一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思路
跳上1級臺階有1種跳法(1)
跳上2級臺階有2種跳法(1-1、2)
跳上3級臺階有4種跳法(1-1-1、1-2、2-1、3)
討論一般情況:假設跳上n級臺階有f(n)種跳法
f(n)種方法包括:
跳上1級臺階后直接跳上n級臺階 ,此時有f(1)種跳法
跳上2級臺階后直接跳上n級臺階 ,此時有f(2)種跳法
跳上3級臺階后直接跳上n級臺階 ,此時有f(3)種跳法
……
跳上n-1級臺階后直接跳上n級臺階 ,此時有f(n-1)種跳法
直接跳上n級臺階 ,此時有1種跳法
得到:
當n=1時,f(n) = 1
當n>1時, f(n) = f(1) + f(2) + … + f(n-1) + 1
因此:
f(n) = 2 ^ (n-1)
實現
public static int JumpFloorII(int target) {
if(target <= 0)
return 0;
int result = 1;
for(int i = 0; i < target-1; ++i) {
result *= 2;
}
return result;
}