爬楼梯:从递推关系到动态规划
285 字
1 分钟
爬楼梯:从递推关系到动态规划
核心结论
到达第 n 阶的最后一步要么跨 1 阶、要么跨 2 阶,因此方案数满足 f(n) = f(n - 1) + f(n - 2)。只需要保留前两个状态,空间可以从 O(n) 降为 O(1)。
问题
每次可以爬 1 或 2 个台阶,计算到达第 n 阶的不同方法数。例如 n = 3 时有 1+1+1、1+2、2+1 三种方法。
状态推导
f(1) = 1。f(2) = 2。- 当
n >= 3时,最后一步的两种情况互斥且覆盖全部方案,所以方案数相加。
Java 实现
class Solution {
public int climbStairs(int n) {
if (n <= 2) {
return n;
}
int previous = 1;
int current = 2;
for (int step = 3; step <= n; step++) {
int next = previous + current;
previous = current;
current = next;
}
return current;
}
}
正确性与复杂度
递推式按最后一步划分所有方案,不重不漏。循环从已知的 f(1)、f(2) 开始,逐步计算到 f(n)。
- 时间复杂度:
O(n)。 - 空间复杂度:
O(1)。
验证
n = 1、2、3 时结果应分别为 1、2、3。再用较大输入确认循环边界和整数范围符合题目约束。
参考
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
爬楼梯:从递推关系到动态规划
https://blog.mintalix.com/posts/study-climbstairs/相关文章智能推荐
1
最小路径和:压缩二维动态规划
algorithms从只能向右或向下移动的约束推导最小路径和状态转移,并将二维状态表压缩为一维数组。
2
最小路径和:二维动态规划基础解法
algorithms使用二维动态规划记录到达每个网格的最小代价,讲清边界初始化、状态转移与复杂度。
3
最大正方形:用相邻状态确定边长
algorithms定义以当前单元格为右下角的最大正方形边长,推导三邻居状态转移,并给出 Java 动态规划实现。
4
太平洋大西洋水流:从海岸反向搜索
algorithms从两片海洋的边界逆着水流方向搜索,求两个可达集合的交集,避免从每个陆地单元重复遍历。
5
被围绕的区域:从边界反向搜索
algorithms从边界上的 O 出发标记所有不可填充区域,再统一翻转剩余单元格,避免逐区域判断边界连通性。
随机文章随机推荐


