1. 程式人生 > >劍指Offer--跳臺階

劍指Offer--跳臺階

題目描述

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

解題思路:

n級臺階,假設有f(n)中跳法,第一步可以選擇跳1級,則剩下(n-1)級臺階,(n-1)級臺階的跳法有f(n-1)種;如果第一步選擇跳2級,則剩下(n-2)級臺階,(n-2)級臺階對的跳法有(n-2)種,所以n級臺階的跳法相當於(n-1)級臺階的跳法加上(n-2)級臺階的跳法,即f(n)=f(n-1)+f(n-2),剩下的可以以此類推。

我來再來考慮n小於等於0、n為1、n為2的情況。如果n<=0的話直接返回0。如果只有1階臺階,則只有一種跳法,如果有2級臺階,則有兩次跳法(第一種:每次跳一級,第二種:一次跳2級)

public class Solution {
    public int JumpFloor(int target) {
        /*遞迴解法*/
        if(target<=0){
            return 0;
        }else if(target==1){
            return 1;
        }else if(target==2){
            return 2;
        }else{
            return JumpFloor(target-1)+JumpFloor(target-
2); } } }

上面的解法是遞迴解法,遞迴的優點是簡單易懂、程式碼量少,但是當遞迴的層數比較大的時候,重複計算的資料比較多,而且容易出現記憶體溢位的風險。所以可以採用迭代的方法來進行優化

public class Solution {
    public int JumpFloor(int target) {
        /*迭代解法*/
        int zero=0;
        int one=1;
        int two=2;
        if(target<=0){
            return zero;
}else if(target==1){ return one; }else if(target==2){ return two; }else{ for(int i=2;i<target;i++){ zero=one+two; one=two; two=zero; } return zero; } } }