您的位置:首页 > 产品设计 > UI/UE

LeetCode: Top K Frequent Elements

2017-04-23 15:31 323 查看
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.
给一个非空的整数数组,返回k个最频繁的元素,算法时间复杂度要求低于O(nlogn)

解题思路:
考虑使用哈希表存储每个元素对应的出现次数,并利用桶排序的思想,将出现次数相同的元素放在同一个桶中。桶之间是有序的,最后从元素出现次数最多的桶开始遍历,取出其中元素,直到满足题目要求。算法时间复杂度为O(n)。

代码如下:
public List<Integer> getTopKFrequent(int[] nums, int k) {

List<Integer>[] bucket = new List[nums.length + 1];
Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();

for (int n : nums) {
frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
}

for (int key : frequencyMap.keySet()) {
int frequency = frequencyMap.get(key);
if (bucket[frequency] == null) {
bucket[frequency] = new ArrayList<>();
}
bucket[frequency].add(key);
}

List<Integer> res = new ArrayList<>();

for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
if (bucket[pos] != null) {
res.addAll(bucket[pos]);
}
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: