LeetCode347. 前 K 个高频元素
题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
前 K 个高频元素
提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
一、解题关键词
二、解题报告
1.思路分析
也可以使用优先堆排序进行处理
2.时间复杂度
3.代码示例
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int num : nums){
map.put(num,map.getOrDefault(num,0) + 1);
}
List<int[]> values = new ArrayList<>();
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
int num = entry.getKey(),count = entry.getValue();
values.add(new int[]{num,count});
}
int [] res = new int [k];
qsort(values,0,values.size() - 1,res,0,k);
return res;
}
void qsort(List<int[]> values,int start,int end,int[] res ,int resIndex,int k){
//快速排序
int picket = (int) (Math.random() * (end - start + 1)) + start;
Collections.swap(values,picket,start);
int pivot = values.get(start)[1];
int index = start;
for(int i = start + 1;i <= end; i++){
if(values.get(i)[1] >= pivot){
Collections.swap(values,index + 1,i);
index ++;
}
}
Collections.swap(values,start,index);
if(k <= index - start){
qsort(values,start , index - 1,res,resIndex,k);
}else{
for(int i = start; i <= index; i++){
res[resIndex++] = values.get(i)[0];
}
if(k > index - start + 1){
qsort(values,index + 1,end,res,resIndex,k -(index - start + 1));
}
}
}
}
2.知识点
总结
排序专题 需要总结一下