给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
# 以下为自己学完之后写的版本
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
map_ = {}
for item in nums:
map_[item] = map_.get(item, 0) + 1
pri_que = []
# for (key, freq) in map_: ✖
for (key, freq) in map_.items():
if len(pri_que) < k:
heapq.heappush(pri_que, (freq, key))
else:
heapq.heappush(pri_que, (freq, key))
heapq.heappop(pri_que)
# 必须先push再pop,否则不对。
return [i[1] for i in pri_que]
# # python内置模块 --- heapq:实现了一个小根堆。
# # 模块内常见的操作函数:
# # 1. heapify(x) : 将列表x转换为堆(小根堆)。
# # 2. heappush(heap,item): 将item压入堆中。(heap使存放堆的数组)
# # 3. heappop(heap): 从堆中弹出最小的项,并将其值返回。
# # heapq堆数据结构最重要的特征是heap[0]永远是最小的元素
# # ————————————————
# # heapq.heapify(list)
# # 将列表转换为最小堆 ,转换完后仍然是列表,所以heapify只是对列表中的元素进行了堆属性的排序
# # import heapq
# # res=[7,1,5,4,2,3]
# # print("列表",res,type(res)) #列表 [7, 1, 5, 4, 2, 3] <class 'list'>
# # heapq.heapify(res)
# # print("最小堆",res,type(res)) #最小堆 [1, 2, 3, 4, 7, 5] <class 'list'>
# # ————————————————
# # heapq.heappush(heap, item)
# # 将元素item压入heap堆(列表)中
# # import heapq
# # res=[7,1,5,6,2,3]
# # heapq.heapify(res)
# # heapq.heappush(res,8)
# # print("最小堆",res,type(res)) #最小堆 [1, 2, 3, 6, 7, 5, 8] <class 'list'>
# # ————————————————
# # heapq.heappop(heap)
# # 删除并返回最小值,因为堆的特征是heap[0]永远是最小的元素,所以一般都是删除第一个元素。故,需要先通过heapify(list) 将list转变为heap。
# # import heapq
# # res=[7,1,5,6,2,3]
# # print("列表",res,type(res)) #列表 [7, 1, 5, 6, 2, 3] <class 'list'>
# # heapq.heapify(res)
# # min_d=heapq.heappop(res)
# # print(min_d) #1
# # print("最小堆",res,type(res)) #最小堆 [2, 5, 3, 6, 7] <class 'list'>
# # ————————————————
# #时间复杂度:O(nlogk)
# #空间复杂度:O(n)
# import heapq
# class Solution:
# def topKFrequent(self, nums: List[int], k: int) -> List[int]:
# #要统计元素出现频率
# map_ = {} #nums[i]:对应出现的次数
# for i in range(len(nums)):
# map_[nums[i]] = map_.get(nums[i], 0) + 1
# # (nums[i], 0)指的是有值则返回值,无值则返回0。
# #对频率排序
# #定义一个小顶堆,大小为k
# pri_que = [] #小顶堆
# #用固定大小为k的小顶堆,扫描所有频率的数值
# for key, freq in map_.items():
# heapq.heappush(pri_que, (freq, key))
# if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
# heapq.heappop(pri_que)
# return [i[1] for i in pri_que]
# # #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
# # result = [0] * k
# # for i in range(k-1, -1, -1):
# # result[i] = heapq.heappop(pri_que)[1]
# # return result