大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39
很容易我們想到使用遞歸求解:
public class Solution {
public int Fibonacci(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
return Fibonacci(n-2) + Fibonacci(n-1);
}
}
當n比較大時,可以明顯感覺算法運行速度比較慢,這是由於上述返回代碼中使用了兩層遞歸,使用遞歸的思想是好的,但是這裏我們可以用迭代明顯改善算法運行效率,用空間換時間:
public class Solution {
public int Fibonacci(int n) {
if(n < 2)
return n;
int f = 0, g = 1;
int result = 0;
for(int i = 1; i < n; i++){
result = f + g;
f = g;
g = result;
}
return result;
}
}
問題變形
我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
分析
對於n步操作,可以分兩種情況討論:
1. 第一步這樣覆蓋
那麼f(n) = f(n-1);
2. 第一步這麼覆蓋
那麼下一步只有可能這麼覆蓋
那麼f(n) = f(n-2)
所以f(n) = f(n-1) + f(n-2)
public class Solution {
public int RectCover(int target) {
if(target <= 1){
return 1;
}
if(target*2 == 2){
return 1;
}else if(target*2 == 4){
return 2;
}else{
return RectCover((target-1))+RectCover(target-2);
}
}
}