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;
    }
}

你可能感兴趣的:(LintCode - 爬楼梯(普通))