分治思想–快速排序 | 优先队列:力扣215. 数组中的第K个最大元素
方法1:哈希表 + 数组 + 排序
先把统计数组中元素出现的次数,放在哈希表中,key是数组元素,value是出现次数。
然后放在数组中对数组排序遍历得到频率前k高的元素
Python实现:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
#哈希表 + 数组 + 排序
hashmap = {}
n = len(nums)
for num in nums:
if num in hashmap:
hashmap[num] += 1
else:
hashmap[num] = 1
temp = []
for key,value in hashmap.items():
temp.append([key,value])
temp.sort(key = lambda x:-x[1])
res = []
for i in range(k):
res.append(temp[i][0])
return res
方法2:哈希表 + 翻转
先把统计数组中元素出现的次数,放在哈希表hashmap中,key是数组元素,value是出现次数。
然后设置一个revseremap, key是次数,value是数组元素(注意:与hashmap键值对相反)
对hashmap遍历:(由于可能会出现频次相同的元素,所以reversemap的value是一个数组)
如果 hashmap的值 在revseremap 中,就添加到revsermap所对应的数组后面
否则,就让reversemap的key值等于[hashmap的key值]
然后从nums的长度,开始倒着遍历:
如果i在revseremap中
循环把出现次数相同的元素加入到结果数组res中
如果res的长度为k,则返回res
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
#哈希表 + 翻转
hashmap = {}
n = len(nums)
for num in nums:
if num in hashmap:
hashmap[num] += 1
else:
hashmap[num] = 1
reversemap = {}
for key, value in hashmap.items():
if value in reversemap:
reversemap[value].append(key)
else:
reversemap[value] = [key]
res = []
for i in range(n,0,-1):
if i in reversemap:
for j in reversemap[i]:
res.append(j)
if len(res) == k:
return res
方法1:
时间复杂度:O(NlogN)
空间复杂度:O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)