最近在刷LeetCode时,又翻到了那道嵌套列表权重的问题。说实话,第一次碰到它时,我直接用了递归DFS,结果在深层嵌套时栈溢出了,差点没崩溃。后来反复琢磨,才悟出点门道。算法这东西,表面看着简单,但优化起来真得动脑子。就拿这个题目来说,给定一个嵌套整数列表,每个元素要么是整数,要么是子列表。权重计算规则是深度乘值,深度从1开始递增。最直观的解法当然是递归,遍历每个元素,如果是整数就累加深度乘值,如果是列表就递归调用并加深深度。代码写起来简单,但空间复杂度O(n)在极端情况下会爆栈,尤其当列表嵌套几十层时,LeetCode测试用例可不留情面。
后来试了迭代BFS,用队列来模拟层级遍历。初始化队列时加入初始列表和深度1。然后循环处理:弹出元素,如果是整数,累加权重;如果是列表,就把所有子元素加入队列,深度加1。这样空间复杂度降到O(m),m是队列最大长度,避免了递归的栈问题。时间上都是O(n),n是总元素数,但迭代更稳定。记得有次面试,面试官特意问这个优化,我现场画图解释队列机制,他点头说“这才是工程思维”。其实算法优化不是炫技,而是解决实际问题。比如在解析JSON或XML数据时,类似嵌套结构很常见,高效解法能提升系统性能。
深度优化还得考虑边界情况。比如空列表或负整数,LeetCode测试用例爱搞这种陷阱。我习惯先写单元测试,模拟各种嵌套模式:单层列表、深层树状、甚至环形引用(虽然题目通常假设非环形)。用Python的话,可以用栈实现DFS迭代,避免递归;Java或C++里,队列配合指针能减少拷贝开销。关键是理解数据结构本质——嵌套列表本质是树,权重计算就是带深度的遍历。每优化一步,性能提升肉眼可见。刷题久了,觉得算法像下棋,一步妙手省去冗余操作,那种爽感比AC还过瘾。
|