2020年9月7日 前 K 个高频元素 topKFrequent
class Solution {
public int[] topKFrequent(int[] nums, int k) {
}
}
解题思路:
思路1:简单解决
这道题如果只是单纯地想要得到结果,算法非常简单。
首先使用一个Map的键来存不同的元素数字,用他的值作为元素的个数。
实现流程:从数组中取出所有元素,取出每一个元素时在Map中将其的值+1,直到取完数组的每一个元素。
然后将map中的键与值取出,排序,找出值最高的那k个元素。
这个方法的时间复杂度应该是略优于nlogn的,应该是k2,但是由于k<=n,也就是说k是可以等于n的。
先尝试看看能否通过。
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map=new HashMap<>();
for (int num : nums) {
if (null==map.get(num)){
map.put(num,1 );
}
else {
map.put(num,map.get(num)+1);
}
}
//map转二维数组方便操作
int[] res=new int[k];
for (int i=0;i<k;i++){
Set<Integer> keyset = map.keySet();
int maxNum=Integer.MIN_VALUE;
for (Integer key : keyset) {
if (map.get(key)>maxNum){
res[i]=key;
maxNum=map.get(key);
}
}
map.remove(res[i]);
}
return res;
}
算法优化:
首先想到的优化方式是我们能否减掉最后的两层循环排序的过程,因为注意到题目中的一句话,不需要排序。也就是说我们不需要知道哪个是第一个。
这道题的关键在于排序,使用hashmap来记录个数很容易做到,问题在于排序前k个元素的排序算法,复杂度要小于nlogn。
虽然知道了要使用最小堆来做了,但是想了半天不知道最小堆该如何实现了,看来需要去复习一下了。