第1題 變態跳臺階【劍指Offer程式設計題】
阿新 • • 發佈:2019-02-16
b# 前言
這是一個新的部分,主要是刷劍指offer上的程式設計題,記錄自己的解法,如果看到比較讚的解法,也會放出來,共同學習。
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
自己的解法
思路
f(n) 代表的是n個臺階有一次1,2,…n階的 跳法數。
- n = 1時
只有1種跳法,f(1) = 1 - n = 2時
會有兩個跳得方式,一次1階或者2階,這回歸到了問題(1) ,f(2) = f(2-1) + f(2-2) - n = 3時
會有三種跳得方式,1階、2階、3階,
那麼就是第一次跳出1階後面剩下:
f(3-1);第一次跳出2階,剩下f(3-2);第一次3階,那麼剩下f(3-3)
因此結論是f(3) = f(3-1)+f(3-2)+f(3-3) - n = n時
會有n中跳的方式,1階、2階…n階,得出結論:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
解法
public class JumpFloorIISolv {
/**
* 一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。
* 求該青蛙跳上一個n級的臺階總共有多少種跳法。
* @param target
* @return
*/
public int JumpFloorII (int target) {
// 1. 宣告階數陣列
int jft[] = new int[target + 1]; //第i項表示,青蛙跳到當前臺階有多少中跳法
// 2. 特殊情況處理
if (target < 0){
return 0;
}else if (target == 0){
return 1;
}else if (target == 1){
return 1;
}else if (target == 2 ){
return 2;
}
// 3. 計算階數
// 3.1 前幾個階數
jft[0] = 1;
jft[1] = 1;
jft[2] = 2;
// 3.2 後面的階數
for(int i = 3; i <= target; ++i){
// 階數的計算類似斐波拉契數列
for(int j = 0; j < i; ++j){
jft[i] += jft[j];
}
}
return jft[target];
}
}
別人的解法
思路
每個臺階都有跳與不跳兩種情況(除了最後一個臺階),最後一個臺階必須跳。所以共用2^(n-1)種情況。
解法
return 1<<--number;
向大佬低頭,在下服了。。。
參考資料
廣告時間
我的個人微信公眾號變成八腳貓,喜歡的小夥伴可以新增一下,不定期分享有趣的文章