版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/88789011
问题描述:
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
思路:在给定的非空数组中如果是考虑到了返回频率前k高的元素,而且要求了时间复杂度必须优于O(nlogn)
在使用了 treemap对数组元素进行遍历统计之后可以通过对treemap的value进行统计排序
import java.util.TreeMap;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.Comparator;
import java.util.Map;
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//使用TreeMap可以对value进行排序的思想
HashMap<Integer, Integer> map = new HashMap<>();
ValueComparator bvc = new ValueComparator(map);
TreeMap<Integer, Integer> sorted_map = new TreeMap<>(bvc);
for(int num:nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num,1);
}
}
//将map直接放入到treemap中
sorted_map.putAll(map);
LinkedList<Integer> res =new LinkedList<>();
Iterator iter = sorted_map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
if(res.size()<k){
//直接通过entry.getKey()获取到的为object对象,需要转换类型为integer类型
res.add((Integer)entry.getKey());
}else{
break;
}
}
return res;
}
}
class ValueComparator implements Comparator<Integer> {
Map<Integer, Integer> base;
//这里需要将要比较的map集合传进来
public ValueComparator(Map<Integer, Integer> base) {
this.base = base;
}
// Note: this comparator imposes orderings that are inconsistent with equals.
//比较的时候,传入的两个参数应该是map的两个key,根据上面传入的要比较的集合base,
//可以获取到key对应的value,然后按照value进行比较
public int compare(Integer a, Integer b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
}