当前位置:   article > 正文

347. 前 K 个高频元素 python_python前k个高频元素

python前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

  1. # 以下为自己学完之后写的版本
  2. import heapq
  3. class Solution:
  4. def topKFrequent(self, nums: List[int], k: int) -> List[int]:
  5. map_ = {}
  6. for item in nums:
  7. map_[item] = map_.get(item, 0) + 1
  8. pri_que = []
  9. # for (key, freq) in map_: ✖
  10. for (key, freq) in map_.items():
  11. if len(pri_que) < k:
  12. heapq.heappush(pri_que, (freq, key))
  13. else:
  14. heapq.heappush(pri_que, (freq, key))
  15. heapq.heappop(pri_que)
  16. # 必须先push再pop,否则不对。
  17. return [i[1] for i in pri_que]
  18. # # python内置模块 --- heapq:实现了一个小根堆。
  19. # # 模块内常见的操作函数:
  20. # # 1. heapify(x) : 将列表x转换为堆(小根堆)。
  21. # # 2. heappush(heap,item): 将item压入堆中。(heap使存放堆的数组)
  22. # # 3. heappop(heap): 从堆中弹出最小的项,并将其值返回。
  23. # # heapq堆数据结构最重要的特征是heap[0]永远是最小的元素
  24. # # ————————————————
  25. # # heapq.heapify(list)
  26. # # 将列表转换为最小堆 ,转换完后仍然是列表,所以heapify只是对列表中的元素进行了堆属性的排序
  27. # # import heapq
  28. # # res=[7,1,5,4,2,3]
  29. # # print("列表",res,type(res)) #列表 [7, 1, 5, 4, 2, 3] <class 'list'>
  30. # # heapq.heapify(res)
  31. # # print("最小堆",res,type(res)) #最小堆 [1, 2, 3, 4, 7, 5] <class 'list'>
  32. # # ————————————————
  33. # # heapq.heappush(heap, item)
  34. # # 将元素item压入heap堆(列表)中
  35. # # import heapq
  36. # # res=[7,1,5,6,2,3]
  37. # # heapq.heapify(res)
  38. # # heapq.heappush(res,8)
  39. # # print("最小堆",res,type(res)) #最小堆 [1, 2, 3, 6, 7, 5, 8] <class 'list'>
  40. # # ————————————————
  41. # # heapq.heappop(heap)
  42. # # 删除并返回最小值,因为堆的特征是heap[0]永远是最小的元素,所以一般都是删除第一个元素。故,需要先通过heapify(list) 将list转变为heap。
  43. # # import heapq
  44. # # res=[7,1,5,6,2,3]
  45. # # print("列表",res,type(res)) #列表 [7, 1, 5, 6, 2, 3] <class 'list'>
  46. # # heapq.heapify(res)
  47. # # min_d=heapq.heappop(res)
  48. # # print(min_d) #1
  49. # # print("最小堆",res,type(res)) #最小堆 [2, 5, 3, 6, 7] <class 'list'>
  50. # # ————————————————
  51. # #时间复杂度:O(nlogk)
  52. # #空间复杂度:O(n)
  53. # import heapq
  54. # class Solution:
  55. # def topKFrequent(self, nums: List[int], k: int) -> List[int]:
  56. # #要统计元素出现频率
  57. # map_ = {} #nums[i]:对应出现的次数
  58. # for i in range(len(nums)):
  59. # map_[nums[i]] = map_.get(nums[i], 0) + 1
  60. # # (nums[i], 0)指的是有值则返回值,无值则返回0。
  61. # #对频率排序
  62. # #定义一个小顶堆,大小为k
  63. # pri_que = [] #小顶堆
  64. # #用固定大小为k的小顶堆,扫描所有频率的数值
  65. # for key, freq in map_.items():
  66. # heapq.heappush(pri_que, (freq, key))
  67. # if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
  68. # heapq.heappop(pri_que)
  69. # return [i[1] for i in pri_que]
  70. # # #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
  71. # # result = [0] * k
  72. # # for i in range(k-1, -1, -1):
  73. # # result[i] = heapq.heappop(pri_que)[1]
  74. # # return result

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/72802
推荐阅读
相关标签
  

闽ICP备14008679号