当前位置:首页 > 力扣 > 力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

5个月前 (05-14)

力扣70题:告别暴力递归!从零实现记忆化搜索解法 递归 算法 力扣 动态规划 C++ 第1张

题意解析:

想象你站在楼梯底部,面前有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]; // 返回已缓存的结果
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

题目重解需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。...

力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

题目重解:小A带着m元钱来到餐馆,菜单上有n道菜,每道菜都有确定的价格。现在需要计算出刚好花完m元的点菜方案总数。这个问题看似简单,但当菜品数量增多时,暴力枚举就会变得不可行,需要更高效的算法来解决。...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

一、题目解读    2024年GESP(青少年软件编程能力等级考试)五级中的“武器强化”(洛谷平台题目编号B4071)是一道典型的算法优化问题。题目要求通过合理...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。