Description
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input:
nums = [1,1,1,2,2,3], k = 2
Output:
[1,2]
Example 2:
Input:
nums = [1], k = 1
Output:
[1]
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.
分析
题目的意思是:求一个数组里面前k个频繁元素。
- 首先建立一个map,然后将map的key value值互换,放进桶里面,然后逆转桶,这样一个一个从桶里面取数据,就是前k个了。
input: nums = [ 1,1,1,1,1 ]
map[1] = 5
then bucket index range should be 0~5, that why bucket size is nums.size() +1.
C++实现
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> mp;
for(auto num:nums){
mp[num]++;
}
vector<vector<int>> buckets(nums.size()+1);
for(auto item:mp){
buckets[item.second].push_back(item.first);
}
reverse(buckets.begin(),buckets.end());
vector<int> result;
for(auto &bucket:buckets){
for(auto i:bucket){
result.push_back(i);
if(result.size()==k){
return result;
}
}
}
return result;
}
};
Python
python有一个counter的库,发现做这个事情很容易,然后取most_common(k)就是频率前k的数字了,感觉python就是一个大bug,哈哈哈。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
counter = Counter(nums)
res = []
for num,c in counter.most_common(k):
res.append(num)
return res
上面的代码有点trick,可能面试官会不认,我们写一个稍微复杂一点的,先按照频率进行统计,然后使用堆排序即可。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
counter = Counter(nums)
res = []
heap = []
for num,freq in counter.items():
heapq.heappush(heap,(-freq,num))
for _ in range(k):
freq,num = heapq.heappop(heap)
res.append(num)
return res