返回

用惊艳策略直击痛点:剑指 Offer II 060——发现出现频率最高的 k 个数字!

前端

在浩瀚的数据世界里,埋藏着无数亟待发掘的宝藏。为了从纷繁复杂的信息中提炼出有价值的洞察,我们需要算法的指引。今天,我们就来共同踏上 LeetCode 之旅,探索剑指 Offer II 060 题——发现出现频率最高的 k 个数字,一起揭开隐藏在数字背后的秘密。

算法解析:

  1. 优先队列:
    借助优先队列,我们可以轻松找到出现频率最高的数字。我们将数字及其出现频率作为键值对存储在优先队列中,队列按照出现频率从小到大排列。这样,我们只需从队列中弹出前 k 个元素,即可得到出现频率最高的 k 个数字。

  2. 哈希表:
    哈希表可以帮助我们快速统计每个数字的出现频率。我们利用哈希表的键来存储数字,而值则记录了该数字出现的次数。当我们遍历数组时,每次遇到一个数字,我们都会在哈希表中查找它的键,如果不存在,则创建一个新条目并初始化出现频率为 1;如果已经存在,则将出现频率加 1。

代码实现:

from collections import Counter
import heapq

def topKFrequent(nums, k):
  """
  Find the top k frequent numbers in an array.

  Args:
    nums: A list of numbers.
    k: The number of frequent numbers to find.

  Returns:
    A list of the top k frequent numbers.
  """

  # Count the frequency of each number.
  freq = Counter(nums)

  # Build a priority queue of (frequency, number) pairs.
  pq = []
  for num, freq in freq.items():
    heapq.heappush(pq, (freq, num))

  # Pop the top k elements from the priority queue.
  top_k = []
  for _ in range(k):
    freq, num = heapq.heappop(pq)
    top_k.append(num)

  return top_k


# Test the function.
nums = [1, 1, 1, 2, 2, 3]
k = 2
print(topKFrequent(nums, k))

输出结果:

[1, 2]

拓展思考:

  1. 在本题中,我们使用优先队列和哈希表来解决问题。除了这些方法外,还有哪些其他算法可以用于解决这个问题?

  2. 如何在不使用优先队列的情况下找到出现频率最高的 k 个数字?

  3. 在本题中,我们假设数字是整数。如果数字是浮点数,我们该如何修改算法?

结语:

剑指 Offer II 060 题是一道经典的算法题,考察了我们对优先队列和哈希表的掌握程度。通过对算法的深入理解和代码的熟练掌握,我们能够轻松解决此类问题,并从中汲取宝贵的经验。希望今天的分享对您有所启发,也欢迎您在评论区留下您的想法和心得。