返回

优先队列轻松搞定力扣 373:查找和最小的 K 对数字

前端

在日常编程中,我们需要经常处理大量数据。为了高效地管理和访问这些数据,数据结构就显得尤为重要。其中,优先队列(Priority Queue)是一种非常实用的数据结构,它可以帮助我们快速找到集合中最重要或最优先的元素。

今天,我们就来使用优先队列解决力扣第 373 题:查找和最小的 K 对数字。

题目

给定一个整数数组 nums 和一个整数 k,请找出并返回 nums 中最小的 k 对数字(每个一对数字由 nums 中的两个不同的数字组成)。

示例:

输入:nums = [1, 7, 11], k = 3
输出:[[1, 11], [1, 7], [7, 11]]
解释:数组中所有数对如下所示,按升序排列:
[1, 1], [1, 7], [1, 11], [7, 11]
因此,前 3 个最小的数对是 [1, 11], [1, 7], [7, 11]

解题思路

使用优先队列解决本题的关键在于将所有数对的差值存储在优先队列中,并每次取出差值最小的数对。

具体步骤如下:

  1. 初始化一个优先队列 pq,并使用匿名函数 lambda 对数对进行排序,差值越小的数对优先级越高。
  2. 将所有数对存入 pq 中。
  3. 循环 k 次,每次从 pq 中取出差值最小的数对并加入结果列表 res 中。
  4. 返回结果列表 res
import heapq

def findPairs(nums, k):
  """
  :type nums: List[int]
  :type k: int
  :rtype: List[List[int]]
  """
  pq = []
  res = []

  for i in range(len(nums)):
    for j in range(i + 1, len(nums)):
      diff = abs(nums[i] - nums[j])
      if diff == k:
        heapq.heappush(pq, (diff, nums[i], nums[j]))

  for _ in range(k):
    if pq:
      diff, i, j = heapq.heappop(pq)
      res.append([i, j])
    else:
      break

  return res

复杂度分析

  • 时间复杂度:O(n^2 log k),其中 n 为数组 nums 的长度。
  • 空间复杂度:O(n^2),因为我们需要存储所有数对。

总结

使用优先队列解决力扣 373 题非常简单高效。只要我们掌握了优先队列的基本原理和使用方法,就可以轻松应对类似的问题。