赞
踩
给你一个整数数组 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
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。