劍指offer:遞迴和迴圈系列問題解答
阿新 • • 發佈:2018-12-13
目錄
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
n<=39
使用遞迴的方式如果數字較大會有很嚴重的效率問題!可以用二叉樹的方式表示這種依賴關係:(以9為例子)
不難發現,出現了很多重複節點,大大降低了運算效率!
class Solution { public: int Fibonacci(int n) { if(n < 2) return n; int a = 0; int b = 0; int c = 1; for(int i = 1;i < n;i++) { a = b + c; b = c; c = a; } return a; } };
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
class Solution {
public:
int jumpFloor(int number) {
if( number < 2 )
{
return 1;
}
return jumpFloor(number - 1) + jumpFloor(number - 2);
}
};
如果把n級臺階看出是n的函式f(n),臺階數n>=2,第一次跳臺階就有兩種不同的選擇,1:第一次跳一階剩下的臺階數為f(n - 1),2:第一次跳兩階時剩下的臺階數為f(n - 2)。
因此總共的可能性為f(n) = f(n - 1) + f(n - 2);不難看出這是一個斐波那契數列!
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2)
f(3) = f(3-1) + f(3-2) + f(3-3)
...
f(n-1) = f(n-2) + f(n-3) + ... + f(n-1-(n-1))
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)
所以可以推出:f(n) = f(n-1) + f(n-1) =f(n-1) * 2
class Solution {
public:
int jumpFloorII(int number) {
if(number < 2)
return number;
return jumpFloorII(number - 1) * 2;
}
};
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
class Solution {
public:
int rectCover(int number) {
if(number <= 2)
return number;
return rectCover(number -1) + rectCover(number -2);
}
};
設n個矩形為f(n),如果第一個豎著放時剩下的為f(7),如果第一個橫著放是為f(6),剩下的可能性為f(n) = f(n -1) + f(n -2)