给定一个非空的整数数组,返回前K个频率最高的元素。例如,[1,1,1,2,2,3] , k = 2, return [1,2].
思路:
最简单的办法就是采用两层for循环去遍历,时间复杂度为O(n2)。
方法二:先用快速排序将数组排序,然后依次找出前k个高频元素,时间复杂度O(NLogN)。
方法三:可以采用HashMap,这种方式时间复杂度为O(N),空间复杂度O(N)。
下面,采用第三种方式:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TopK {
HashMap<Integer, Integer> map;
public static void main(String[] args){
TopK t = new TopK();
int[] arr={1,2,3,5,2,3,5,7,7,7,5,7};
ArrayList<Integer> nums = t.topK(arr,4);
System.out.println(nums);
}
public ArrayList<Integer> topK(int[] arr,int k){
map = new HashMap<Integer,Integer>();
for(int i=0;i<arr.length;i++){
Integer count = map.get(arr[i]);
if(count ==null){
count=0;
}
map.put(arr[i], count+1);
}
List<Integer>[] keyList = new List[arr.length]; //构造一个数组来放map中的key;
for(int key:map.keySet()){
int cnt = map.get(key); //map中数出现的次数;
if(keyList[cnt]==null){
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(key);
keyList[cnt] = temp;
}else{
keyList[cnt].add(key);
}
}
ArrayList<Integer> res = new ArrayList<Integer>(); //存放结果
for(int i=keyList.length-1;i>=0&&res.size()<k;i--){ //取高频数字
if(keyList[i]!=null){
res.addAll(keyList[i]);
}
}
return res;
}
}