3 ways
https://discuss.leetcode.com/topic/48158/3-java-solution-using-array-maxheap-treemap
TreeSet
public class Solution {
class Number {
int val;
int freq;
public Number(int v, int f) {
this.val = v;
this.freq = f;
}
}
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer, Number> map = new HashMap<>();
TreeSet<Number> set = new TreeSet<>(new Comparator<Number>(){
public int compare(Number n1, Number n2) {
if (n1.freq > n2.freq) {
return -1;
} else if (n1.freq < n2.freq) {
return 1;
} else {
return n1.val - n2.val;
}
}
});
for (int num : nums) {
if (!map.containsKey(num)) {
Number number = new Number(num, 1);
map.put(num, number);
set.add(number);
} else {
Number number = map.get(num);
set.remove(number);
number.freq = number.freq + 1;
set.add(number);
}
}
// for (int num : map.keySet()) {
// set.add(map.get(num));
// }
List<Integer> result = new ArrayList<>();
Iterator it = set.iterator();
while (result.size() < k) {
result.add(((Number)it.next()).val);
// if (!set.isEmpty()) {
// Number number = set.pollFirst();
// result.add(number.val);
// }
}
return result;
}
}