安全08--ジャンプ階段を証明するために[オファー]

ステップジャンプ

時間制限:1秒
スペースの制約:32768K
この質問の知識:递归

件名の説明:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution {
    public int JumpFloor(int target) {

    }
}

分析:

当 n = 1 时,只有一种跳法 f(1)=1
当 n = 2 时,有两种跳法 f(2)=2
当 n >= 3 时,由于第一次跳的情况只有两种 1步/2步,后序跳的对应的是 f(n-1)/f(n-2)
    此时对于 f(n),有 f(n) = f(n-1)+f(n-2)
由上述分析可知该题所求是斐波那契数列。

解決策1:

/**
 * 简单递归求解
 */
public class Solution {
    public int JumpFloor(int target) {
        if(target <= 0) return 0;
        if(target == 1) return 1;
        if(target == 2) return 2;
        
        // 对于 target >= 3 的情况
        return JumpFloor(target-1) + JumpFloor(target-2);
    }
}

対処方法2:

/**
 * 分析知道了所求为斐波那契数列 f(n) = f(n-1) + f(n-2)
 * 对递归求解的思路进行优化:
 *   动态维护 i=f(n-2)+f(n-1) 和 j=f(n-1)+f(n) 两个值,最后返回 i
 */
public class Solution {
    public int JumpFloor(int target) {
        if(target <= 0) return 0;
        
        int i = 1;
        int j = 2;
        int tmp;
        /*
         * 当 target = 1,不执行 while, 返回 i=1 {i=f(1)=1,j=f(2)=2}
         * 当 target = 2,执行1遍 while,返回 i=2 {i=f(2)=2,j=f(1)+f(2)=3}
         * 当 target = 3,执行2遍 while,返回 i=3 (i=f(1)+f(2)=3,j=f(2)+f(3)=5)
         * ......
         * 当 target = n,执行(n-1)遍 while,返回 i {i=f(n-2)+f(n-1),j=f(n-1)+f(n)}
         */
        while((--target)>0){
            tmp = j;
            j += i;
            i = tmp;
        }
        
        return i;
    }
}

おすすめ

転載: www.cnblogs.com/jianminglin/p/11374794.html