题解 | #跳台阶#

跳台阶

http://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4

动态规划

这一个基本的动态规划的题,我们需要对问题进行拆分 假设我们处于x层,在合法的情况下,我们考虑,那些可能是结果集。 可以发现,答案是类似:

		aaaaa...aaaax  路径
        bbbbb...aaaax
        

似乎很不好考虑(最后都是在x层),我们不妨考虑最后一步,也就是如何到x的,在合法的情况下,到x的途径有两种,即x-1而来,x-2而来,于是可以得出:f[n] = f[n - 1] + f[n - 2];

于是得出了出版的答案:可以ac

public class Solution {
    int f[] = new int[41];
    public int jumpFloor(int target) {
        f[0] = 1;
        f[1] = 1;
        for(int i = 2;i <= target;i++){
            f[i] = f[i - 1] + f[i - 2];
        }
        return f[target];
    }
}

但是题目要求空间复杂度为O(1),于是继续分析,我们发现,当前层的结果集只和上一层和上上一层,所以我们直接维护遍历记录即可

public class Solution {
    public int jumpFloor(int target) {
        int a = 1;
        int b = 1;
        for(int i = 2;i <= target;i++){
            int tmp = b;
            b = b + a;
            a = tmp;
        }
        return b;
    }
}

最后我们发现数据量很小,不妨打个表(投机取巧)。

public class Solution {
    static int f[] = {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141};
    public int jumpFloor(int target) {
        return f[target];
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务