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

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

2个月前 (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"。...

力扣面试题 16.01 :用异或操作玩转两数交换

力扣面试题 16.01 :用异或操作玩转两数交换

给定一个长度为 2 的整数数组 numbers,要求在不使用额外内存空间(即不使用临时变量)的情况下,交换数组中的两个元素并返回。题目考验对位运算的理解与应用,需通过巧妙的异或操作实现两数值...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

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

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

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

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

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

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

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

发表评论

访客

看不清,换一张

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