LintCode - 爬樓梯(普通)

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

難度:容易
要求:

假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?
樣例 :
比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法
返回 3

思路:
爬樓梯可以用到斐波那契數列F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)所以我們程序中需要用到遞歸函數。記住如果樓梯的階數是N,這上樓梯的方法總數為f(N+1)。

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int n) {
        // write your code here
        if(n = 0){
          return 1;
        }
        if (n == 1 || n == 2) {
         return n;
        }
        int n1 = 1;
        int n2 = 2;
        for (int i = 3; i <= n; i++) {
            int tmp = n2;
            n2 = n1 + n2;
            n1 = tmp;
        }
        return n2;
    }
}

如果此題可擴展為一次可以跨m級臺階,則共有多少種方法?

public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int climbStairs(int ladder) {
        // write your code here
        return calculateCount(ladder,2);
    }
    
    public int calculateCount(int ladder, int maxJump) {
        int jump = 0;
        if (ladder == 0) {
            return 1;
        }
        if (ladder >= maxJump) {
            // 剩下的樓梯大于最大可跳躍數
            for (int i = 1; i <= maxJump; i++) {
                jump += calculateCount(ladder - i, maxJump);
            }
        } else {
            // 剩下的樓梯不足最大可跳躍數
            jump = calculateCount(ladder, ladder);
        }
        return jump;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容