LeetCode堆题解与TopK应用

需积分: 0 0 下载量 80 浏览量 更新于2024-08-03 收藏 5KB MD 举报
"Leetcode刷题笔记-堆" 在这个笔记中,我们将深入探讨堆在LeetCode编程挑战中的应用,尤其是针对堆排序和优先级队列的题目。堆是一种特殊的树形数据结构,它具有两个主要类型:大顶堆(最大堆)和小顶堆(最小堆)。在完全二叉树中,堆的特性决定了它们的高效性,比如堆顶元素总是最大(大顶堆)或最小(小顶堆)。 1. 堆的特性: - 完全二叉树结构,每个节点的值要么是左子节点的最大值,要么是右子节点的最大值(大顶堆),或者反之(小顶堆)。 - 数组表示堆时,通常第一个元素视为空位,以便与节点编号对应。父节点编号通常是子节点的一半,左子节点为`2n`,右子节点为`2n+1`(或`2n+2`,根据个人习惯)。 2. 大顶堆和小顶堆: - 大顶堆:堆顶元素是所有节点中最大的,适合用于求解最大值问题,如Top K问题,即找到数组中最大的前K个元素。 - 小顶堆:堆顶元素是最小的,常用于求解最小值问题,例如LeetCode第347题——前K个高频元素,需要找出数组中出现频率最高的前K个元素。 3. Top K问题: - 对于小顶堆,需要维护一个包含K个元素的堆,新元素与堆顶元素(最小值)比较,如果新元素更小,则无需操作,因为新元素会自动保持堆的性质。 - 对于大顶堆,类似地,但寻找的是最大元素,新元素会替换堆顶(最大值)。 4. 最小堆的构造: - 从小顶堆的最后一个非叶子节点开始调整,通过比较父节点和子节点的值,确保子节点的值不大于父节点,这样可以保证堆的性质。例如,给定一个数组`nums = [1,1,1,2,2,3,4,4,4,4,6,6,6,6,6,6,6,6,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8,8,8,8,8,8,8,8,8,8]`,可以先计算频率统计,然后根据堆的调整规则构建最小堆。 5. Python实现: - 使用内置的`collections.Counter`来统计元素频率,这是一种简洁的方法。 - 构建最小堆时,可以使用迭代或递归的方式,从最后一个非叶子节点开始调整堆,例如通过遍历数组,将每个元素与父节点比较,必要时交换位置,直到满足最小堆的性质。 堆在LeetCode的算法题中扮演着重要角色,理解和掌握堆的特性和操作是提高解题效率的关键。通过实例和实践,能够更好地应对涉及堆的各类问题。