題目
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
1.思路
這個題是斐波那契數列問題的變形。
思路(1)
用【劍指offer】面試題10(1)-斐波那契數列中解答斐波那契數列問題的思路即可:
創建並初始化兩個變量FibonacciFirst = F(0)和FibonacciSecond = F(1),在求解過程中不斷更新FibonacciFirst和FibonacciSecond,即依次把已經得到的兩個數列中間項保存起來,這樣就可以根據定義,對斐波那契數列遞推地進行求解了,而且不會產生重複計算
時間複雜度是O(n),空間複雜度是O(1)。
思路(2)
根據題目可以推理出等式:
到達第 i 階的方法總數 = 第 i -1 階方法數 + 第 i -2 階方法數
所以利用創建一個大小爲n的數組就可以根據等式關係求解問題,雖然空間複雜度不如第一種方法,但是代碼比較容易理解。
時間複雜度是O(n) ,空間複雜度是O(n) ,
2.代碼(Java實現)
// 思路(1)斐波那契
public class Solution {
public long JumpFloor(int target) {
if(target == 1) {
return 1;
}
if(target == 2) {
return 2;
}
long FibonacciFirst = 1;
long FibonacciSecond = 2;
long FibonacciN = 0;
for (int i = 2; i < target; i ++) {
FibonacciN = FibonacciFirst + FibonacciSecond;
FibonacciFirst = FibonacciSecond;
FibonacciSecond = FibonacciN;
}
return FibonacciN;
}
}//時間複雜度: O(n) ;空間複雜度:O(1)
// 思路(2)藉助數組
public class Solution {
public int JumpFloor(int target) {
if (target == 1) {
return 1;
}
int[] dp = new int[target];
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i < target; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[target - 1];
}
}//時間複雜度: O(n) ;空間複雜度:O(n)