当前位置:   article > 正文

LeetCode-Python-347. 前K个高频元素_python . 前 k 个高频元素

python . 前 k 个高频元素

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

  1. 输入: nums = [1,1,1,2,2,3], k = 2
  2. 输出: [1,2]

示例 2:

  1. 输入: nums = [1], k = 1
  2. 输出: [1]

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。

第一种思路:

调库

  1. class Solution(object):
  2. def topKFrequent(self, nums, k):
  3. """
  4. :type nums: List[int]
  5. :type k: int
  6. :rtype: List[int]
  7. """
  8. return [digit for digit, fre in collections.Counter(nums).most_common(k)]

第二种思路:

题目问前K个高频,就是求前k个出现次数最大的元素。

经典的TOP k问题一般都是用heap,此题同理。

比较朴素的方法是:

先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,

然后pop k次 堆顶,即可找到前k个出现次数最大的元素。

  1. class Solution(object):
  2. def topKFrequent(self, nums, k):
  3. """
  4. :type nums: List[int]
  5. :type k: int
  6. :rtype: List[int]
  7. """
  8. from collections import Counter
  9. from heapq import *
  10. # time: O(nlogn)
  11. # space: O(n)
  12. dic = Counter(nums) # O(n)
  13. heap = []
  14. heapify(heap)
  15. for key, val in dic.items():
  16. heappush(heap, (-val, key)) # O(nlogn)
  17. # print heap
  18. res = []
  19. while k: # O(klogn)
  20. top = heappop(heap)
  21. # print top
  22. res.append(top[1])
  23. k -= 1
  24. return res

第三种思路:

优化一下,实际上并不需要把所有元素都放进堆里,因为我们找到是前k个,所以堆的大小为k其实就够用了,

在这种情况下, 建立并维护一个size 为k 的最小堆,使得堆顶元素的出现频率是堆中所有元素出现频率中最小的,

遍历字典,如果一个元素当前出现频率 比 堆顶元素的出现频率都要小,则说明它必不可能是 TOP k 元素;

否则,将当前元素插入堆中,并pop一次,以保证最小堆的size始终为k。

  1. class Solution(object):
  2. def topKFrequent(self, nums, k):
  3. """
  4. :type nums: List[int]
  5. :type k: int
  6. :rtype: List[int]
  7. """
  8. from collections import Counter
  9. from heapq import *
  10. # time: O(nlogk)
  11. # space: O(n)
  12. dic = Counter(nums) # O(n)
  13. heap = []
  14. heapify(heap)
  15. for key, val in dic.items(): # O(nlogk)
  16. if len(heap) < k:
  17. heappush(heap, (val, key))
  18. else:
  19. if heap[0][0] < val:
  20. heappush(heap, (val, key))
  21. heappop(heap)
  22. # print heap
  23. res = []
  24. while heap: # O(klogk)
  25. top = heappop(heap)
  26. res.append(top[1])
  27. return res

 

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

闽ICP备14008679号