问题:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
题解:
- 动态规划
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;
}
- 斐波那契数列
/**
* 斐波那契数列
* 根据动态规划得出结论,爬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];
}