力扣70.爬楼梯

109 阅读1分钟

问题:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

题解:

  1. 动态规划
private Map<Integer, Integer> temp = new HashMap<>();

/**
 * 动态规划
 * @param n
 * @return
 */
public int climbStairs(int n) {
    // 终止条件
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }
    // 记忆中间值,防止超时
    if (temp.containsKey(n)) {
        return temp.get(n);
    }
    // 最终有两种情况爬到第n阶,从n-1阶爬1层,和从n-2阶爬两层,所以总的方式=爬到n-1阶的方法数+爬到n-2阶的方法数
    int t = climbStairs(n - 1) + climbStairs(n - 2);
    temp.put(n, t);
    return t;
}
  1. 斐波那契数列
/**
 * 斐波那契数列
 * 根据动态规划得出结论,爬n层=爬n-1层+爬n-2层的方法数综合
 * @param n
 * @return
 */
public int climbStairs_2(int n) {
    int[] dp = new int[n + 1];
    dp[0] = 1;
    dp[1] = 1;
    for(int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}