📅  最后修改于: 2023-12-03 14:55:34.380000             🧑  作者: Mango
在编程中,我们经常需要找到数组中出现次数最多的元素。但是当我们需要找到出现次数第 K 多的元素时,该怎么办?本文将介绍如何在数组中查找出现次数第 K 多的元素。
第一种方法是利用哈希表和堆来查找出现次数第 K 多的元素。具体步骤如下:
代码实现如下:
import heapq
from collections import defaultdict
def find_kth_most_frequent(nums, k):
freq_dict = defaultdict(int)
for num in nums:
freq_dict[num] += 1
min_heap = []
for num, freq in freq_dict.items():
heapq.heappush(min_heap, (freq, num))
if len(min_heap) > k:
heapq.heappop(min_heap)
return min_heap[0][1]
在该代码中,freq_dict
为存储元素出现次数的哈希表,min_heap
为存储元素及其出现次数的小根堆。程序遍历完哈希表后,只需要返回堆顶元素的值即可。
该算法的时间复杂度为 O(nlogk),其中 n 为数组大小,k 为要查找的出现次数的排名。
第二种方法是利用桶排序来查找出现次数第 K 多的元素。具体步骤如下:
代码实现如下:
def find_kth_most_frequent(nums, k):
freq_dict = defaultdict(int)
for num in nums:
freq_dict[num] += 1
max_freq = max(freq_dict.values())
bucket = [[] for _ in range(max_freq+1)]
for num, freq in freq_dict.items():
bucket[freq].append(num)
count = 0
for i in range(max_freq, 0, -1):
count += len(bucket[i])
if count >= k:
return bucket[i][-1]
在该代码中,freq_dict
为存储元素出现次数的哈希表,bucket
为存储出现次数对应元素的桶。程序遍历完哈希表后,从桶中最后一个元素开始计数,直到计数器达到 K,返回当前桶中最后一个元素即可。
该算法的时间复杂度为 O(n),其中 n 为数组大小。