1. 算法复健训练的价值与意义
最近在算法复健训练中完成了Day10的栈与队列专题,重点攻克了LeetCode上的三道压轴难题:150(逆波兰表达式求值)、239(滑动窗口最大值)和347(前K个高频元素)。这三道题可以说是栈与队列应用的经典代表,涵盖了从基础应用到高级技巧的多个层面。
算法复健这个概念可能有些朋友不太熟悉,简单来说就是像运动员保持竞技状态一样,通过定期训练来维持和提升算法解题能力。对于准备面试或者需要保持编程敏感度的开发者来说,这种训练方式非常有效。我自己坚持算法复健已经半年多,明显感觉到解题思路更加清晰,编码速度也有了显著提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三道压轴题的核心思路解析
2.1 LC 150 - 逆波兰表达式求值
这道题是栈结构的经典应用场景。逆波兰表达式(后缀表达式)的特点是操作符位于两个操作数之后,比如"2 1 + 3 *"对应的是常规表达式"(2 + 1) * 3"。
解题的核心思路是:
- 初始化一个空栈
- 遍历表达式中的每个元素
- 遇到数字就压入栈中
- 遇到运算符就从栈顶弹出两个数字进行计算,然后将结果压回栈中
- 最后栈中剩下的唯一元素就是最终结果
注意:减法和除法要注意操作数的顺序,先弹出的是右操作数,后弹出的是左操作数。
实际编码时,我建议使用一个哈希表来存储运算符和对应的lambda函数,这样代码会更加简洁:
python复制operators = {
"+": lambda a, b: a + b,
"-": lambda a, b: a - b,
"*": lambda a, b: a * b,
"/": lambda a, b: int(a / b)
}
2.2 LC 239 - 滑动窗口最大值
这道题考察的是如何在每个滑动窗口中找到最大值。暴力解法的时间复杂度是O(n*k),而使用单调队列可以将复杂度优化到O(n)。
单调队列的核心思想是维护一个双端队列,保证队列中的元素从大到小排列,且都在当前窗口范围内。具体实现步骤:
- 初始化双端队列和结果列表
- 遍历数组中的每个元素
- 移除队列中不在当前窗口范围内的元素(从队首)
- 移除队列中比当前元素小的元素(从队尾)
- 将当前元素加入队尾
- 如果窗
