前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
解题步骤
首先我们需要获取每一个元素所对应的出现的频率,如何获取?
使用键值对来实现,将元素的值设置为key,将出现的频率设置为value。遍历数组,如果存在该值,将键值对的value数值+1,也就是频率+1。
实现代码:
class test{
public int[] initHashMap01(int[] nums){
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
//map.getOrDefault(key, value):如果map存在key值,返回该key所对应的值,否则返回一个自定义初始值value。
}
}
public int[] initHashMap02(int[] nums){
HashMap<Integer, Integer> map = new HashMap<>();
for(int num: nums){
if(map.containsKey(num)){
map.put(num, get(num)+1);
}else{
map.put(num, 1);
}
}
}
}
其次我们要将value排序,选择最大的k个值,并将所对应的key存放在数组中,并输出!
思路:如果通过一个value寻找key,不一定是唯一的,但是key寻找value是简单的。
但是如何转换也是该问题的一大难点。既然是采用哈希,我们就把哈希图贯彻到底,将value作为索引,并将相同的元素key值作为一个链表,从而实现该结果。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
List<Integer>[] list= new List[nums.length + 1];
for (int key : map.keySet()) {
int value= map.get(key);
if (list[value] == null) {
list[value] = new LinkedList<>();
}
list[value].add(key);
}
List<Integer> ans = new ArrayList<>();
for (int i = list.length - 1; i >= 0 && ans.size() < k; i--) {
if (list[i] != null) {
ans.addAll(list[i]);
}
}
return ans.stream().mapToInt(Integer::valueOf).toArray();//将List转换成int数组
}
}