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

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

7个月前 (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]; // 返回已缓存的结果
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

题目解读‌:在二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索树本身具有左小右大的特性...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

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

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

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

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

发表评论

访客

看不清,换一张

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