给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
例如,给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。
注意:
你可以假设给定的 k 总是合理的,1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
解题思路:
采用map存储每个元素出现的次数。
然后按照键值对的value逆序排序。
取前k个值。
public List<Integer> getMaxFrequnceK(int[] a,int k){
Map<Integer, Integer> map=new HashMap();
for(int i=0;i<a.length;i++){
if(map.containsKey(a[i])){
map.put(a[i], map.get(a[i])+1);
}
else{
map.put(a[i], 1);
}
}
List<Map.Entry<Integer, Integer>> list=new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>(){
//降序
@Override
public int compare(Entry<Integer, Integer> o1,
Entry<Integer, Integer> o2) {
return o2.getValue()-o1.getValue();
}
});
List<Integer> resList=new ArrayList<>();
for(Map.Entry<Integer, Integer> entry:list){
resList.add(entry.getKey());
if(resList.size()==k){
break;
}
}
return resList;
}
compator的compare方法,o1-o2为升序,o2-o1为降序
网友评论