返回
用惊艳策略直击痛点:剑指 Offer II 060——发现出现频率最高的 k 个数字!
前端
2024-01-19 08:43:45
在浩瀚的数据世界里,埋藏着无数亟待发掘的宝藏。为了从纷繁复杂的信息中提炼出有价值的洞察,我们需要算法的指引。今天,我们就来共同踏上 LeetCode 之旅,探索剑指 Offer II 060 题——发现出现频率最高的 k 个数字,一起揭开隐藏在数字背后的秘密。
算法解析:
-
优先队列:
借助优先队列,我们可以轻松找到出现频率最高的数字。我们将数字及其出现频率作为键值对存储在优先队列中,队列按照出现频率从小到大排列。这样,我们只需从队列中弹出前 k 个元素,即可得到出现频率最高的 k 个数字。 -
哈希表:
哈希表可以帮助我们快速统计每个数字的出现频率。我们利用哈希表的键来存储数字,而值则记录了该数字出现的次数。当我们遍历数组时,每次遇到一个数字,我们都会在哈希表中查找它的键,如果不存在,则创建一个新条目并初始化出现频率为 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]
拓展思考:
-
在本题中,我们使用优先队列和哈希表来解决问题。除了这些方法外,还有哪些其他算法可以用于解决这个问题?
-
如何在不使用优先队列的情况下找到出现频率最高的 k 个数字?
-
在本题中,我们假设数字是整数。如果数字是浮点数,我们该如何修改算法?
结语:
剑指 Offer II 060 题是一道经典的算法题,考察了我们对优先队列和哈希表的掌握程度。通过对算法的深入理解和代码的熟练掌握,我们能够轻松解决此类问题,并从中汲取宝贵的经验。希望今天的分享对您有所启发,也欢迎您在评论区留下您的想法和心得。