堆是一种特殊的树形数据结构,它是一个完全二叉树,满足堆的性质。

  • 最大堆 - 在最大堆中,一个节点的值必须是其在整个子树中的节点值中最大的。这个性质对于树中的所有节点都必须是递归成立的。
  • 最小堆 - 在最小堆中,一个节点的值必须是其在整个子树中的节点值中最小的。这个性质对于树中的所有节点都必须是递归成立的。

在算法面试的背景下,堆和优先队列可以被视为相同的数据结构。当需要重复移除具有最高(或最低)优先级的对象,或者在插入与删除根节点之间需要穿插时,堆是一个很有用的数据结构。

学习资源

实现

语言 API
C++ std::priority_queue
Java java.util.PriorityQueue
Python heapq
JavaScript N/A

时间复杂度

操作 大O表示
查找最大/最小 O(1)
插入 O(log(n))
删除 O(log(n))
堆化(从给定的元素数组创建堆) O(n)

技巧

提及k

如果在问题中看到提到了顶部或底部的_k_,通常意味着可以使用堆来解决这个问题,例如在前K个高频元素中。

如果需要获取前_k_个元素,则使用大小为_k_的最小堆。遍历每个元素,将其推入堆中(对于Python的heapq,在推入之前翻转值以找到最大值)。每当堆的大小超过_k_时,删除最小元素,这将保证你拥有_k_个最大元素。

核心问题

这些是你练习这个主题时必须掌握的核心问题。

推荐练习问题

在你已经为这个主题进行了学习和练习核心问题之后,推荐你练习这些问题。

推荐课程

import AlgorithmCourses from '../_courses/AlgorithmCourses.md'