題目描述:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
思路:
我們先考慮青蛙第一跳:
- 第一次跳1個臺階,那麼還剩n-1個臺階,跳法爲f(n-1)
- 第一次跳2個臺階,那麼還剩n-2個臺階,跳法爲f(n-2)
所以總的跳法:f(n)=f(n-1)+f(n-2)
- 當跳到只剩1個臺階時,有1種跳法:f(1)=1
- 當跳到只剩2個臺階時,有2種跳法:f(2)=2
觀察發現,這就是一個斐波那契數列
我的代碼:
public int JumpFloor(int target) {//target爲臺階總數
if(target==2){
return 2;
}
if(target==1){
return 1;
}
if(target<=0){
return 0;
}
return JumpFloor(target-1)+JumpFloor(target-2);
}
運行時間:544ms
佔用內存:9056 k
改進:
爲避免遞歸產生的棧溢出,改用自底向上的動態規劃(迭代)來解題:
public int JumpFloor(int target) {
if(target==2){
return 2;
}
if(target==1){
return 1;
}
if(target<=0){
return 0;
}
int first = 1, second = 2, third = 0;
for (int i = 3; i <= target; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
運行時間:15ms
佔用內存:9328 k