返回

LeetCode:大展身手,揭秘数组中的第K个最大元素(上)

前端

LeetCode:破解数组中的第K个最大元素之迷——堆排序大法(上)#

踏上征服之旅:数组中的第K个最大元素

在计算机科学的世界中,LeetCode是一个备受欢迎的在线评测平台,汇聚了众多编程高手,争相一较高下。而“数组中的第K个最大元素”则是该平台上颇具分量的经典算法题之一。

该题的本质是要求你在给定一个无序数组和一个整数K的情况下,找出数组中第K个最大的元素。举个例子,如果我们有一个数组[3, 2, 1, 5, 6, 4],且K为2,那么第K个最大元素就是5。

揭秘算法奥义:构建大顶堆

为了解决这一问题,我们首先要了解堆排序的奥秘。堆排序是一种建立在堆数据结构之上的排序算法。堆是一种特殊的完全二叉树,其具有以下特性:

  • 每个节点的值都大于或等于其左右子节点的值。
  • 堆中不存在空节点。

在堆排序中,我们将无序数组构建成一个大顶堆。大顶堆是指堆顶元素是堆中最大的元素,且每个非叶节点的值都大于或等于其左右子节点的值。

巧用大顶堆:寻找Kth Largest

构建好大顶堆后,我们可以利用它来快速找到数组中的第K个最大元素。具体步骤如下:

  1. 将数组中的元素依次插入大顶堆中。
  2. 重复以下步骤K-1次:
    • 将堆顶元素弹出。
    • 将堆顶元素替换为堆中最后一个元素。
    • 调整堆,确保堆仍然满足大顶堆的性质。
  3. 此时,堆顶元素就是数组中的第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. 将数组中的元素依次插入大顶堆中,得到以下堆:
        -1
       / \
      -2  -3
     / \  / \
    -4 -5 -6 -7
    
  2. 重复以下步骤K-1次(即1次):
    • 将堆顶元素弹出,得到以下堆:
         -2
        / \
       -3  -4
      / \  / \
      
    -5 -6 -7 -8
    - 将堆顶元素替换为堆中最后一个元素,得到以下堆:
    
     -2
    / \
    
    -3 -1
    / \ /
    -5 -6 -7 -8
    - 调整堆,确保堆仍然满足大顶堆的性质,得到以下堆:
    
     -2
    / \
    
    -1 -3
    / \ /
    -5 -6 -7 -8
  3. 此时,堆顶元素就是数组中的第2个最大元素,即5。

结语:算法之旅,永无止境

通过本文,我们探索了如何使用堆排序来解决LeetCode上“数组中的第K个最大元素”这一经典算法题。我们首先构建了一个大顶堆,然后利用这个堆来快速找到数组中的第K个最大元素。希望大家能够从中有所收获,并在算法的世界中不断前行。