根据问题描述,我们无法使用暴力的方法进行求解,要求时间<nlogn也就是快排的时间复杂度 因此我们考虑使用hash和堆来维护前k高的元素,再根据hash中的key来进行快排总共时间复杂度为O(n+klogk)
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
// 创建一个最小堆,根据出现次数排序
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
(entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())
);
// 将所有元素添加到堆中
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
minHeap.offer(entry);
}
int []sort=new int[k];
for(int i=0;i<k;i++){
sort[i]=minHeap.poll().getKey();
}
Arrays.sort(sort);
// 构建结果字符串
StringBuilder sb = new StringBuilder();
for(int i=0;i<k;i++){
sb.append(sort[i]);
if (i<k-1) {
sb.append(","); // 如果不是最后一个元素,则添加逗号
}
}
return sb.toString();
ac代码如上