矩阵最大路径乘积递归加记忆化后结果错误如何排查?
问题排查结果
核心错误1:记忆化数组初始化逻辑错误
你使用的let myMemo = new Array(3).fill(new Array(3).fill(null));存在引用共享问题:fill方法传入的数组是同一个实例,这意味着myMemo的所有行都指向同一块内存地址,修改任意一行的某个元素,其他所有行对应位置的元素都会同步变更,直接导致记忆化存储的数据完全混乱,这是输出结果错误的核心原因。
正确初始化写法:
// 给每一行单独生成独立的数组,避免引用共享 let myMemo = new Array(3).fill(null).map(() => new Array(3).fill(null));
核心错误2:终点节点未存入记忆化数组
当前代码中,到达右下角终点的base case分支直接返回了结果对象,没有写入记忆化数组,当多个路径访问终点节点时无法复用计算结果,属于逻辑漏洞,需要补充写入逻辑:
// 原base case修改为: if(i == matrix.length - 1 && j == matrix[0].length - 1){ const res = { product: matrix[i][j], path: [] }; memo[i][j] = res; return res; }
修复上述两个问题后,运行代码即可得到和纯回溯版本一致的正确输出,乘积为2016,路径也符合预期。
额外注意事项
如果矩阵中存在负数,当前仅存储最大乘积的记忆化逻辑会失效,因为负负得正的特性可能让路径上的最小值乘以负数后变成更大的结果,此时需要同时存储每个位置的最大乘积和最小乘积才能得到正确结果。
内容的提问来源于stack exchange,提问作者ControlAltDelete
相关产品推荐
相关产品推荐

