问题描述
假设你正在爬楼梯,需要n阶才能到达楼顶。每次你可以爬1或2个台阶。有多少种不同的方法可以爬到楼顶?
方法一:动态规划(推荐)
java
public class ClimbingStairs {
/**
* 动态规划方法 - 时间复杂度O(n),空间复杂度O(n)
*/
public static int climbStairsDP(int n) {
if (n <= 2) return n;
int[] dp = new int[n + 1];
dp[1] = 1; // 1阶有1种方法
dp[2] = 2; // 2阶有2种方法
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
/**
* 动态规划 - 空间优化版,时间复杂度O(n),空间复杂度O(1)
*/
public static int climbStairsDPOptimized(int n) {
if (n <= 2) return n;
int prev1 = 1; // 前1阶的方法数
int prev2 = 2; // 前2阶的方法数
int current = 0;
for (int i = 3; i <= n; i++) {
current = prev1 + prev2;
prev1 = prev2;
prev2 = current;
}
return current;
}
}
方法二:递归(不推荐用于大数)
java
/**
* 递归方法 - 时间复杂度O(2^n),空间复杂度O(n)
* 注意:这种方法在n较大时效率很低
*/
public static int climbStairsRecursive(int n) {
if (n <= 2) return n;
return climbStairsRecursive(n - 1) + climbStairsRecursive(n - 2);
}