# 找出一个数组中的前k个高频元素

 public List<Integer> topKFrequent(int[] nums, int k) {
// 统计元素的频率
Map<Integer, Integer> freqMap = new HashMap<>();
for (int num : nums) {
freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);
}

// 对元素按照频率进行降序排序
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(freqMap.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});

// 取出前k个元素
int count = 0;
List<Integer> ret = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : list) {
++count;
if (count >= k) {
break;
}
}
return ret;
}

 public List<Integer> topKFrequent(int[] nums, int k) {
// 统计元素的频率
Map<Integer, Integer> map = new HashMap<>(16);
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}

// 遍历map，用最小堆保存频率最大的k个元素
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return map.get(a) - map.get(b);
}
});

for (Integer key : map.keySet()) {
if (pq.size() < k) {
} else if (map.get(key) > map.get(pq.peek())) {
pq.remove();
}
}

// 取出最小堆中的元素
List<Integer> ret = new ArrayList<>();
while (!pq.isEmpty()) {
}

return ret;
}

 public List<Integer> topKFrequent(int[] nums, int k) {
// 统计元素的频次
Map<Integer, Integer> int2FreqMap = new HashMap<>(16);
for (int num : nums) {
int2FreqMap.put(num, int2FreqMap.getOrDefault(num, 0) + 1);
}

// 桶排序
List<Integer>[] bucket = new List[nums.length + 1];
for (Integer key : int2FreqMap.keySet()) {
int freq = int2FreqMap.get(key);
if (bucket[freq] == null) {
bucket[freq] = new ArrayList<>();
}
}

// 逆序（频次由高到低）取出元素
List<Integer> ret = new ArrayList<>();
for (int i = nums.length; i >= 0 && ret.size() < k; --i) {
if (bucket[i] != null) {
}
}

return ret;
}

10-24
07-31 663

09-11 3133
03-19 2383
02-26 145