力扣70题:告别暴力递归!从零实现记忆化搜索解法
题意解析:
想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支,最终需要计算所有直达终点路径的叶子节点总数。
思路解析:
从顶层台阶逆向思考:到达第n阶的最后一步,可能是从n-1阶跨1级而来,或是从n-2阶跨2级而来。递归基例设定n=0或n=1时仅有1种走法(平地不动或单步直上)。通过数组a缓存子问题解,将暴力递归的指数复杂度优化至线性复杂度。每次递归先查询缓存,未命中时计算结果并存入数组,避免重复计算。
代码解析:
class Solution {
public:
int a[46]; // 记忆化数组,题目约束n<=45
Solution() // 构造函数初始化数组
{
for(int i=0;i<45;i++)
{
a[i]=0; // 初始标记为未计算状态
}
}
int climbStairs(int n) {
if(n==0 || n==1) // 基例:平地也算一种路径,单台阶仅一种走法
{
return 1;
}
if(a[n]==0) // 尚未计算过当前台阶的解
{
// 关键递推式:当前解=前一级台阶解+前两级台阶解
a[n]=climbStairs(n-1)+climbStairs(n-2);
}
return a[n]; // 返回已缓存的结果
}
};原创内容 转载请注明出处






