爬楼梯问题是一个经典的动态规划问题。给定一个楼梯,总共有 n
阶台阶,每次可以爬 1 阶或 2 阶,要求计算有多少种不同的方法可以爬到楼顶。通过观察小规模的例子,可以发现爬楼梯的方法数遵循斐波那契数列的规律。
算法分析
要到达第 n
阶台阶,最后一步有两种选择:
- 从第
n-1
阶爬 1 阶上来。 - 从第
n-2
阶爬 2 阶上来。
因此,到达第 n
阶的总方法数是这两者的和:
f(n) = f(n-1) + f(n-2)
这与斐波那契数列的递推关系一致。初始条件为:
- f(1) = 1
- f(2) = 2
基于以上观察,可以使用动态规划的方法高效地计算出结果。
Java实现
public class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
int a = 1, b = 2;
for (int i = 3; i <= n; i++) {
int temp = b;
b = a + b;
a = temp;
}
return b;
}
}
代码解释
- 初始条件处理:
- 如果
n == 1
,直接返回 1,因为只有一种方法爬到第 1 阶。
- 如果
- 变量初始化:
a
初始化为f(1) = 1
b
初始化为f(2) = 2
- 循环计算:
- 从
i = 3
到i = n
,计算f(i) = f(i-1) + f(i-2)
。 - 使用临时变量
temp
来更新a
和b
的值,避免覆盖。
- 从
- 返回结果:
- 循环结束后,
b
中存储的是f(n)
的值,直接返回b
。
- 循环结束后,
复杂度分析
- 时间复杂度:O(n),因为需要进行
n - 2
次循环。 - 空间复杂度:O(1),只使用了常数个额外空间(变量
a
和b
)。
这次设计依旧是速度取胜,内存消耗大。同时我们可以知道的是,完成算法问题,需要我们具有一定的数学知识。例如这次的爬楼梯问题,如果不知道斐波那契数列,那么我们可以会从其他方面进行算法设计,就可能会耗费更多的时间精力。