利用map ,key为数值,value为数值出现的次数。
根据value值进行逆序排序
然后输出前k
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < nums.length ; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
}
List<Map.Entry<Integer, Integer>> tlist = new ArrayList<>(map.entrySet());
//对tlist 进行你排序
Collections.sort(tlist, new Comparator< Map.Entry<Integer, Integer>>(){
@Override
public int compare(Map.Entry<Integer, Integer> o1,Map.Entry<Integer, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});//对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法.实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。
for(int j = 0 ;j < k ; j++) {
list.add(tlist.get(j).getKey()); //将tlist 中前k个 key值存入list
}
return list;
}
参考
桶排序,记录。
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < nums.length ; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0)+1);
}
//桶排序 bucket大小为nums 大小+1。 map中value值作为索引,防止数组下标错误,列如[1,1,1,1] 则bucket[4] 里面放key值 1 。
List <Integer>[] bucket = new List[nums.length +1];
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
int index = (int) entry.getValue(); //取 value 作为桶的索引(外层数组),并创建list
if(bucket[index] == null) {
bucket[index] = new ArrayList<Integer>();
}
bucket[index].add((Integer) entry.getKey()); //将value 相同的放入一个list中
}
for(int j = nums.length ;j >0 && list.size() < k ; j--) {
if(bucket[j] != null) {
list.addAll(bucket[j]); //将满足条件的一个桶中所有值添加到 list中
}
}
return list;
}
}