news 2026/8/25 2:44:28

栈、滑动窗口与堆:算法面试高频题解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
栈、滑动窗口与堆:算法面试高频题解析

1. 算法训练营第十天内容概览

今天的三道题目分别来自栈与队列、滑动窗口和堆的应用场景。150题逆波兰表达式考察栈的基本操作,239题滑动窗口最大值需要设计特殊数据结构,347题前K个高频元素则是堆的典型应用。这三道题在笔试面试中出现频率极高,特别是滑动窗口问题,在系统设计领域也有广泛应用。

2. 逆波兰表达式求值

2.1 表达式转换原理

逆波兰表达式(后缀表达式)的计算过程完美契合栈的特性。与中缀表达式不同,它不需要括号来指定运算顺序,运算符总是作用于最近的两个操作数。例如中缀表达式"3 + 4 * 2"转换为后缀表达式就是"3 4 2 * +"。

关键点:遇到数字入栈,遇到运算符则弹出栈顶两个元素运算后将结果入栈

2.2 Python实现细节

from operator import add, sub, mul def div(x, y): # 处理Python负数除法的特殊情况 return int(x/y) if x*y > 0 else -(abs(x)//abs(y)) class Solution: op_map = {'+':add, '-':sub, '*':mul, '/':div} def evalRPN(self, tokens: List[str]) -> int: stack = [] for token in tokens: if token not in self.op_map: stack.append(int(token)) else: op2 = stack.pop() op1 = stack.pop() stack.append(self.op_map[token](op1, op2)) return stack.pop()

常见错误:

  1. 操作数顺序错误:减法除法要注意操作数顺序
  2. 类型转换遗漏:字符串转整数不能忘
  3. 除法处理不当:Python的负数除法需要特殊处理

3. 滑动窗口最大值

3.1 单调队列设计

常规暴力解法时间复杂度O(nk),使用单调队列可优化到O(n)。核心思想是维护一个可能成为窗口最大值的候选队列。

from collections import deque class MonotonicQueue: def __init__(self): self.queue = deque() def push(self, val): # 维护队列单调递减 while self.queue and val > self.queue[-1]: self.queue.pop() self.queue.append(val) def pop(self, val): # 只有要移除的值是当前最大值时才出队 if self.queue and val == self.queue[0]: self.queue.popleft() def max(self): return self.queue[0]

3.2 滑动窗口实现

def maxSlidingWindow(nums: List[int], k: int) -> List[int]: mq = MonotonicQueue() res = [] # 初始化第一个窗口 for i in range(k): mq.push(nums[i]) res.append(mq.max()) # 滑动窗口 for i in range(k, len(nums)): mq.pop(nums[i-k]) # 移除离开窗口的元素 mq.push(nums[i]) # 添加新进入窗口的元素 res.append(mq.max()) return res

优化技巧:

  1. 队列存储索引而非值,方便判断元素是否在窗口内
  2. 使用双端队列比列表操作更快
  3. 提前分配结果列表空间减少内存分配开销

4. 前K个高频元素

4.1 堆的应用原理

小顶堆的堆顶总是最小元素,维护一个大小为K的堆,当新元素频率大于堆顶时替换,最终剩下的就是前K高频元素。

4.2 完整实现

import heapq def topKFrequent(nums: List[int], k: int) -> List[int]: freq_map = {} for num in nums: freq_map[num] = freq_map.get(num, 0) + 1 min_heap = [] for num, freq in freq_map.items(): if len(min_heap) < k: heapq.heappush(min_heap, (freq, num)) else: if freq > min_heap[0][0]: heapq.heappop(min_heap) heapq.heappush(min_heap, (freq, num)) return [item[1] for item in min_heap]

进阶优化:

  1. 使用快速选择算法可以达到O(n)时间复杂度
  2. 对于海量数据可以考虑分治+多路归并
  3. 实际工程中可以结合哈希表和堆外存储处理超大数据

5. 常见问题排查

5.1 逆波兰表达式问题

  • 栈空异常:检查表达式合法性
  • 运算顺序错误:注意减法和除法的操作数顺序
  • 除法舍入:Python的//运算符与题目要求可能不同

5.2 滑动窗口问题

  • 窗口大小变化:处理k=0或k>n的情况
  • 队列维护错误:确保单调性不被破坏
  • 边界条件:处理前k个元素时的初始化

5.3 堆应用问题

  • 频次统计错误:负数或零需要特殊处理吗
  • 堆大小控制:k值大于元素种类数时的处理
  • 输出顺序:题目是否要求按频率排序输出

6. 工程实践建议

  1. 逆波兰表达式计算器可以扩展支持更多运算符
  2. 滑动窗口算法在实时流处理系统中很常见
  3. 前K高频元素算法可用于热点数据统计
  4. 三种算法组合可以解决更复杂的系统设计问题

在实际编码时,建议先写出暴力解法,再逐步优化。理解每个数据结构的适用场景比死记硬背更重要。我在面试候选人时,最看重的就是能否清晰解释算法选择的原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 2:42:16

给Agent一个目标,它还你一个方案:自主规划型Agent产品评测——企业智能自动化落地与主流厂商架构对比

随着大模型落地进程的加速&#xff0c;企业数字化转型正从简单的“单点工具替代”迈向深度的“全链路协同”。在这一过程中&#xff0c;AI Agent作为新一代的数字员工&#xff0c;正在重新定义人机协同范式。过去&#xff0c;传统的业务自动化依赖于人工预设的刚性规则&#xf…

作者头像 李华
网站建设 2026/8/25 2:35:42

HashMap、B+树与缓存问题:Java后端面试核心解析

1. 项目概述这次快手后端日常实习一面涵盖了四个核心知识点&#xff1a;HashMap底层实现原理、B树索引机制、缓存三大经典问题&#xff0c;以及10亿级数据TopK算法。作为Java后端开发岗位的常见面试题&#xff0c;这些内容既考察基础数据结构的掌握程度&#xff0c;又检验解决实…

作者头像 李华
网站建设 2026/8/25 2:35:29

MLCR-AA榜单与Claude Fable 5:智能体能力评测的新基准与工程实践

最近在技术社区里&#xff0c;一个名为“MLCR-AA”的榜单开始被频繁提及&#xff0c;榜单首位是一个听起来有些陌生的名字——Claude Fable 5。如果你和我一样&#xff0c;第一反应是去搜索“Claude Fable 5”是什么&#xff0c;大概率会感到困惑&#xff1a;搜索结果里充斥着“…

作者头像 李华
网站建设 2026/8/25 2:35:17

从论文到代码:高效提取GitHub模块实现工程复用的系统方法

在实际科研和工程实践中&#xff0c;研究生和开发者常面临一个核心矛盾&#xff1a;阅读前沿论文时&#xff0c;能理解其创新思想&#xff0c;却难以将论文中的核心算法或模块快速转化为可复用的代码&#xff1b;同时&#xff0c;GitHub 上虽有海量开源项目&#xff0c;但面对一…

作者头像 李华
网站建设 2026/8/25 2:35:01

从论文到代码:高效定位创新点与GitHub模块复用的工程实践

1. 先搞清楚“读论文挖创新点”和“GitHub模块复用”到底在解决什么如果你正在读研&#xff0c;或者刚开始做项目&#xff0c;最头疼的两件事可能就是&#xff1a;论文看不懂&#xff0c;代码跑不通。“读论文挖创新点”解决的是“看什么”和“怎么看”的问题。不是让你通读全文…

作者头像 李华
网站建设 2026/8/25 2:33:42

HiFi-BRep:从视觉生成到工程可用的AI CAD模型生成新范式

最近在尝试用AI生成三维模型时&#xff0c;我遇到了一个非常典型的问题&#xff1a;模型看起来“像”了&#xff0c;但一拿到CAD软件里&#xff0c;不是面片破损就是无法进行布尔运算&#xff0c;更别提后续的工程分析了。这就像用乐高搭出了一个汽车的外形&#xff0c;但内部结…

作者头像 李华