赞
踩
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
- 输入: nums = [1,1,1,2,2,3], k = 2
- 输出: [1,2]
示例 2:
- 输入: nums = [1], k = 1
- 输出: [1]
说明:
第一种思路:
调库
- class Solution(object):
- def topKFrequent(self, nums, k):
- """
- :type nums: List[int]
- :type k: int
- :rtype: List[int]
- """
- return [digit for digit, fre in collections.Counter(nums).most_common(k)]
第二种思路:
题目问前K个高频,就是求前k个出现次数最大的元素。
经典的TOP k问题一般都是用heap,此题同理。
比较朴素的方法是:
先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,
然后pop k次 堆顶,即可找到前k个出现次数最大的元素。
- class Solution(object):
- def topKFrequent(self, nums, k):
- """
- :type nums: List[int]
- :type k: int
- :rtype: List[int]
- """
-
- from collections import Counter
- from heapq import *
- # time: O(nlogn)
- # space: O(n)
- dic = Counter(nums) # O(n)
-
- heap = []
- heapify(heap)
- for key, val in dic.items():
- heappush(heap, (-val, key)) # O(nlogn)
-
- # print heap
- res = []
- while k: # O(klogn)
- top = heappop(heap)
- # print top
- res.append(top[1])
- k -= 1
- return res
第三种思路:
优化一下,实际上并不需要把所有元素都放进堆里,因为我们找到是前k个,所以堆的大小为k其实就够用了,
在这种情况下, 建立并维护一个size 为k 的最小堆,使得堆顶元素的出现频率是堆中所有元素出现频率中最小的,
遍历字典,如果一个元素当前出现频率 比 堆顶元素的出现频率都要小,则说明它必不可能是 TOP k 元素;
否则,将当前元素插入堆中,并pop一次,以保证最小堆的size始终为k。
- class Solution(object):
- def topKFrequent(self, nums, k):
- """
- :type nums: List[int]
- :type k: int
- :rtype: List[int]
- """
-
- from collections import Counter
- from heapq import *
-
- # time: O(nlogk)
- # space: O(n)
- dic = Counter(nums) # O(n)
-
- heap = []
- heapify(heap)
-
- for key, val in dic.items(): # O(nlogk)
- if len(heap) < k:
- heappush(heap, (val, key))
- else:
- if heap[0][0] < val:
- heappush(heap, (val, key))
- heappop(heap)
-
- # print heap
- res = []
- while heap: # O(klogk)
- top = heappop(heap)
- res.append(top[1])
- return res
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。