思路

这是一个斐波那契数列。以3为例:

F(3) = F(2) + F(1)

F(1) = 1

F(2) = 2

所以F(3) = 1 + 2 = 3

可以用递归法求解。

这种题目的关键就是找通项公式。

代码

public class Solution {
    public int jumpFloor(int target) {
        if (target == 1) return 1;
        if (target == 2) return 2;
        return jumpFloor(target - 2) + jumpFloor(target - 1);
    }
}

当然这样解题虽然很简单,却很浪费空间。这种类型的题其实和斐波那契数列是一类问题,都可以用动态规划算法来做:

/**
 * 
 * @param number int整型 
 * @return int整型
 */
int jumpFloor(int number ) {
    // write code here
    if (number == 1) return 1;
    if (number == 2) return 2;

    int dp[number+1];
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;

    for (int i = 3; i <= number; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }

    return dp[number];
}

利用了C语言快而小的特性,以及动态规划算法之后,此时的时间消耗仅5ms,内存占用不过542KB。同样的算法,用Go来写,速度上与C持平,但是空间占用还是略大,1200KB:

package main

/**
 * 
 * @param number int整型 
 * @return int整型
*/
func jumpFloor( number int ) int {
    // write code here
    if number == 1 {
        return 1
    }
    if number == 2 {
        return 2
    }
    dp := make([]int, number+1)
    dp[0] = 0
    dp[1] = 1
    dp[2] = 2

    for i := 3; i <= number; i++ {
        dp[i] = dp[i-1] + dp[i-2]
    }

    return dp[number]
    
}