public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
List<Integer> res = new ArrayList<Integer>();
for(int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
ArrayList<Integer>[] bucket = new ArrayList[nums.length + 1];
for(int key : map.keySet()) {
int times = map.get(key);
if(bucket[times] == null) {
bucket[times] = new ArrayList<Integer>();
}
bucket[times].add(key);
}
for(int i = bucket.length - 1; i >= 0 && res.size() < k; i--) {
if(bucket[i] != null) {
res.addAll(bucket[i]);
}
}
return res;
}
如果这题求最大出现次数的那个元素是很简单的,本题的难度在于求多个。
本题的关键点:
1.首先用map将元素作为键,将次数作为值;
2.设置一个数组,这个数组的下标为出现次数,值为元素;
3.遍历map,将bucket初始化;
4.从后往前遍历bucket,注意:res.size() == k时结束,否则有两个相同出现次数的元素时,答案错误。
另外一题与此题也很相似 692. Top K Frequent Words
public List<String> topKFrequent(String[] words, int k) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(String s : words) {
map.put(s, map.getOrDefault(s, 0) + 1);
}
@SuppressWarnings("unchecked")
ArrayList<String>[] frequence = new ArrayList[words.length + 1];
for(String s : map.keySet()) {
int time = map.get(s);
if(frequence[time] == null) {
frequence[time] = new ArrayList<String>();
}
frequence[time].add(s);
}
List<String> res = new ArrayList<String>();
for(int i = frequence.length - 1; i > 0 && res.size() < k; i--) {
if(frequence[i] != null) {
Collections.sort(frequence[i]);
if(res.size() + frequence[i].size() > k) {
int len = res.size();
for(int j = 0; j < k - len; j++) {
res.add(frequence[i].get(j));
}
} else {
res.addAll(frequence[i]);
}
}
}
return res;
}