常见面试题--爬楼梯 斐波那契数列的应用

有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶,问小孩有多少种走法可以上去,类似的问题很多。

典型的动态规划问题

设到达第 i 阶台阶有f(i)种走法

我们可以轻易的发现 当阶梯数 n = 1 时,f(1) = 1;

              n = 2时,f(2) = 2;

              n = 3时,f(n) = 4;

当n>=4时,假设小孩当前处于第 i 阶,那么他的前一步有3种可能:

  1.在 i-1 阶上1阶到达第 i 阶

  2.在 i-2 阶上2阶到达第 i 阶

  3.在 i-3 阶上3阶到达第 i 阶

那么到达第 i 阶走法总和 = 到达i-1阶的走法 + 到达i-2阶的走法+到达i-3阶的走法 

即 f(i) = f(i-1) + f(i-2) + f(i-3)

代码:

public int waysToStep(int n) {
        long first = 1;
        long second = 2;
        long third = 4;
        if (n < 3)
            return n;
        if (n == 3)
            return 4;
        long res = 0;
        for (int i = 4; i <= n; i++) {
            res = first + second + third;
            first = second;
            second = third;
            third = res;
        }
        return res;
    }

代码思路和斐波那契相差无几,当n交大的时候,注意是否整数溢出,及时采取模数或者将int改为long

 

posted @ 2020-05-03 12:58  dwwzone  阅读(368)  评论(0编辑  收藏  举报