Given a non-empty array of integers, return the k most frequent elements.
For example, Given [1,1,1,2,2,3] and k = 2, return [1,2].
Note: You may assume k is always valid, 1 ? k ? number of unique elements. Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
思路
这是一个O(n)时间复杂度的算法,优于O(nlogn)
1. 求出每个数字的频次字典
2. 按照频次,装入桶中
3. 取前K个频次
Code
Python version
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
frequencyMap={}
bucket=[]
for n in nums:
if frequencyMap.get(n)!=None:
frequencyMap[n]+=1
else:
frequencyMap[n]=1
bucket.append([])
bucket.append([])
for item in frequencyMap:
frequency = frequencyMap[item]
bucket[frequency].append(item)
res=[]
pos = len(bucket) - 1
while pos >= 0 and len(res)< k:
if len(bucket[pos])>0:
for item in bucket[pos]:
res.append(item)
pos-=1
return res