返回
LeetCode:大展身手,揭秘数组中的第K个最大元素(上)
前端
2024-01-08 19:20:54
LeetCode:破解数组中的第K个最大元素之迷——堆排序大法(上)#
踏上征服之旅:数组中的第K个最大元素
在计算机科学的世界中,LeetCode是一个备受欢迎的在线评测平台,汇聚了众多编程高手,争相一较高下。而“数组中的第K个最大元素”则是该平台上颇具分量的经典算法题之一。
该题的本质是要求你在给定一个无序数组和一个整数K的情况下,找出数组中第K个最大的元素。举个例子,如果我们有一个数组[3, 2, 1, 5, 6, 4],且K为2,那么第K个最大元素就是5。
揭秘算法奥义:构建大顶堆
为了解决这一问题,我们首先要了解堆排序的奥秘。堆排序是一种建立在堆数据结构之上的排序算法。堆是一种特殊的完全二叉树,其具有以下特性:
- 每个节点的值都大于或等于其左右子节点的值。
- 堆中不存在空节点。
在堆排序中,我们将无序数组构建成一个大顶堆。大顶堆是指堆顶元素是堆中最大的元素,且每个非叶节点的值都大于或等于其左右子节点的值。
巧用大顶堆:寻找Kth Largest
构建好大顶堆后,我们可以利用它来快速找到数组中的第K个最大元素。具体步骤如下:
- 将数组中的元素依次插入大顶堆中。
- 重复以下步骤K-1次:
- 将堆顶元素弹出。
- 将堆顶元素替换为堆中最后一个元素。
- 调整堆,确保堆仍然满足大顶堆的性质。
- 此时,堆顶元素就是数组中的第K个最大元素。
代码实现:秀出你的编程实力
def find_kth_largest(nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
# 构建大顶堆
heap = []
for num in nums:
heapq.heappush(heap, -num)
# 弹出堆顶元素K-1次
for _ in range(k - 1):
heapq.heappop(heap)
# 堆顶元素就是数组中的第K个最大元素
return -heapq.heappop(heap)
实例演示:感受算法的魅力
现在,我们来用一个例子来演示一下这个算法是如何工作的。假设我们有一个数组[3, 2, 1, 5, 6, 4],且K为2。
- 将数组中的元素依次插入大顶堆中,得到以下堆:
-1 / \ -2 -3 / \ / \ -4 -5 -6 -7
- 重复以下步骤K-1次(即1次):
- 将堆顶元素弹出,得到以下堆:
-2 / \ -3 -4 / \ / \
- 将堆顶元素替换为堆中最后一个元素,得到以下堆:
-3 -1-2 / \
/ \ /
-5 -6 -7 -8- 调整堆,确保堆仍然满足大顶堆的性质,得到以下堆:
-1 -3-2 / \
/ \ /
-5 -6 -7 -8 - 将堆顶元素弹出,得到以下堆:
- 此时,堆顶元素就是数组中的第2个最大元素,即5。
结语:算法之旅,永无止境
通过本文,我们探索了如何使用堆排序来解决LeetCode上“数组中的第K个最大元素”这一经典算法题。我们首先构建了一个大顶堆,然后利用这个堆来快速找到数组中的第K个最大元素。希望大家能够从中有所收获,并在算法的世界中不断前行。