求元素次数,想到用 map 计录。
前 k 个高频元素:排序。
map 无法对值排序,可更换 map 键值位置,或把map 转化为list 来实现。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap();
//记录次数
for(int i : nums){
if(map.containsKey(i)){
map.put(i,map.get(i)+1);
}else{
map.put(i,1);
}
}
//排序
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue()-o1.getValue();
}
});
int i =0;
nums = new int[k];
for (Map.Entry<Integer, Integer> e: list) {
nums[i++]=e.getKey();
if(i>=k){
break;
}
}
return nums;
}
}
知识点:
map 无法直接对值排序,需要转化为list,使用 Collections.sort 排序。
排序的时候要么大于,要么小于,要么等于,不能存在歧义,无法判定大小的情况。
o1>o2 是升序。
其他答案:
最恰当的数据结构:优先级队列。(堆,完全二叉树),可以实现对数据进行排序。
PriorityQueue<Map.Entry<Integer,Integer>> queue =
new PriorityQueue<>((o1,o2)-> o1.getValue-o2.getValue);
知识点:
优先级队列使用
重写排序方法
offer == set
poll == get 并删除