leetcode347 前k个高频元素
给定一个非空整数数组,返回其中出现频率前k高的元素
在外设置比较器,定义自己的比较方法,然后传给PriorityQueue
private class Freq {
public int e,freq;
public Freq(int e,int freq){ //构造函数
this.e=e;
this.freq=freq;
}
// public int compareTo(Freq another){
// if(this.freq<another.freq)
// return -1;
// else if(this.freq > another.freq)
// return 1;
// else
// return 0;
// }
}
private class FreqComparator implements Comparator<Freq>{//实现接口
public int compare(Freq a,Freq b){
return a.freq - b.freq; //逻辑和上面的一样 谁的频率小让谁靠前
}
}
public List<Integer> topKFrequent(int[] nums, int k) {
TreeMap<Integer,Integer> map=new TreeMap<>();
for(int num:nums){
if(map.containsKey(num))
map.put(num,map.get(num)+1);
else
map.put(num,1); //这样map中就包含了每个元素和每个元素出现的频次
}
PriorityQueue<Freq> pq = new PriorityQueue<>(new FreqComparator());
for(int key:map.keySet()){//用优先队列求出前k个元素
if(pq.size()<k)
pq.add(new Freq(key,map.get(key)));
else if(map.get(key)>pq.peek().freq){
pq.remove();
pq.add(new Freq(key,map.get(key)));
}
}
LinkedList<Integer> res = new LinkedList<>();
while(!pq.isEmpty())
res.add(pq.remove().e);
return res;
}
以上专门给比较器做了一个类,用匿名类改变java内置的类型
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a, Integer b){
return map.get(a) - map.get(b); //看的是a对应的频率和b对应频率的大小
}
java8以上内部类已经改变书写格式
PriorityQueue<Integer> pq = new PriorityQueue<>(
(a,b)->map.get(a)-map.get(b)
);
最后的代码简化为
class Solution {
// private class Freq {
// public int e,freq;
// public Freq(int e,int freq){ //构造函数
// this.e=e;
// this.freq=freq;
// }
// public int compareTo(Freq another){
// if(this.freq<another.freq)
// return -1;
// else if(this.freq > another.freq)
// return 1;
// else
// return 0;
// }
// }
// private class FreqComparator implements Comparator<Freq>{//实现接口
// public int compare(Freq a,Freq b){
// return a.freq - b.freq; //逻辑和上面的一样 谁的频率小让谁靠前
// }
// }
public List<Integer> topKFrequent(int[] nums, int k) {
TreeMap<Integer,Integer> map=new TreeMap<>();
for(int num:nums){
if(map.containsKey(num))
map.put(num,map.get(num)+1);
else
map.put(num,1); //这样map中就包含了每个元素和每个元素出现的频次
}
PriorityQueue<Integer> pq = new PriorityQueue<>(
(a,b)->map.get(a)-map.get(b)
);
for(int key:map.keySet()){//用优先队列求出前k个元素
if(pq.size()<k)
pq.add(key);
else if(map.get(key)>map.get(pq.peek())){
pq.remove();
pq.add(key);
}
}
LinkedList<Integer> res = new LinkedList<>();
while(!pq.isEmpty())
res.add(pq.remove());
return res;
}
}