题目描述
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
package leetcode_n;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class LeetCode347_topKFrequent {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
int maxFreq = 0; //记录最大频数
//统计频数 key:数字 value:频数
for (int i = 0;i < nums.length;i++) {
if (!map.containsKey(nums[i])) {
map.put(nums[i], 1);
}else {
map.put(nums[i], map.get(nums[i]) + 1);
}
maxFreq = Math.max(maxFreq, map.get(nums[i]));
}
//用桶(数组 + 链表)即数组的元素类型是链表 把频数相同的都放在一个桶里
ArrayList<Integer>[] bucket = new ArrayList[maxFreq + 1]; //桶的长度为最大频数
for (int key:map.keySet()) { //遍历map
int freq = map.get(key);
if (bucket[freq] == null) {
bucket[freq] = new ArrayList<>();
}
bucket[freq].add(key); //频数作为索引
}
//数组从后到前选出前k
ArrayList<Integer> res = new ArrayList<>();
for (int i = maxFreq;i > 0;i--) {
if (bucket[i] != null) {
for (int b : bucket[i]) {
res.add(b);
k--;
//System.out.println("k="+k);
if (k == 0) {
return res;
}
}
}
}
return res;
}
public static void main(String[] args) {
int[] nums = {-1,-1};
int k = 1;
LeetCode347_topKFrequent lc = new LeetCode347_topKFrequent();
System.out.println(lc.topKFrequent(nums, k));
}
}