【劍指offer】面試題10(2)-跳臺階

題目

一隻青蛙一次可以跳上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) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章