给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
这里采用的方法是:利用map计算出每个数字出现的次数,然后利用定制比较器将entry(map的内部类,这里当成map理解也可以)的value进行排序,取得前k个值。
public class HighFrequencyElement {
int[] result ;
public int[] topKFrequent(int[] nums, int k) {
//k比元素个数大的话就直接全部输出
if (k > nums.length) {
return nums;
}
int len = nums.length;
result = new int[k];
//创建map计算每个数字出现的个数,以键值对存储
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < len; i++) {
if (map.keySet().contains(nums[i])) {
map.put(nums[i], map.get(nums[i]) + 1);
} else {
map.put(nums[i], 1);
}
}
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
//用list将entry进行排序,这里还可以用connection,可以尝试下
list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
System.out.println(list);
//取得高频为前k个的值
for (int i = 0; i < k; i++) {
result[i] = (Integer) list.get(i).getKey();
}
return result;
}
}
还有其他方法也能解决这道题,可以利用堆
下面是leetCode官方的解法
https://leetcode-cn.com/problems/top-k-frequent-elements/solution/qian-k-ge-gao-pin-yuan-su-by-leetcode-solution/