劍指offer:跳臺階問題

基礎跳臺階

題目

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(前後次序不一樣算不一樣的結果)。spa

解題思路

這道題就是斐波那契數列的變形問法,由於跳上第N個臺階有兩種方式,第一個就是從第N-1個臺階上跳一級上來,第二個就是從第N-2個臺階上跳兩級上來。code

那麼求到第N個臺階的方法就轉變成求到第N-1臺階的辦法和到第N-2個臺階的方法,將二者相加便可,全部f(n)=f(n-1)+f(n-2),惟一一點區別在於初始值,這裏的初始值是blog

f(1) = 1;f(2)=2遞歸

能夠用遞歸和非遞歸保存前一個結果兩種方式來實現,具體可參考劍指offer系列中斐波那契那篇博文。get

 

變態跳臺階

題目

一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級……它也能夠跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。class

解題思路

變態跳臺階相對於普通版本的跳臺階的改變在於第N個臺階不單單能夠由第N-1和第N-2個臺階到達,它是能夠從第它下面的任一個臺階到達,基礎

全部f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,最後一個臺階是能夠直接從第0個臺階調到第N個臺階這種狀況,繼續推導方法

f(n) =  f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,f(n+1) = f(n)+f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1 = 2*f(n)di

f(1) = 1,f(2)=2=2*f(1)co

固然仍是能夠用遞歸和非遞歸兩種方式來解決

代碼

 遞歸

1     public int JumpFloorII(int target) {
2         if(target==1){
3             return 1;
4         }else{
5             return 2*JumpFloorII(target-1);
6         }
7     }

 

 

非遞歸

1     public int JumpFloorII(int target) {
2         int[] saveData = new int[target+1];
3         saveData[1] = 1;
4         for(int i=2;i<=target;i++){
5             saveData[i] = 2*saveData[i-1];
6         }
7         return saveData[target];
8     }
相關文章
相關標籤/搜索