每日一题算法:前 K 个高频元素](https://leetcode-cn.com/problems/top-k-frequent-elements/) topKFrequent

2020年9月7日 前 K 个高频元素 topKFrequent

每日一题算法:前 K 个高频元素](https://leetcode-cn.com/problems/top-k-frequent-elements/) topKFrequent_第1张图片

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        
    }
}

解题思路:

思路1:简单解决

这道题如果只是单纯地想要得到结果,算法非常简单。

首先使用一个Map的键来存不同的元素数字,用他的值作为元素的个数。

实现流程:从数组中取出所有元素,取出每一个元素时在Map中将其的值+1,直到取完数组的每一个元素。

然后将map中的键与值取出,排序,找出值最高的那k个元素。

这个方法的时间复杂度应该是略优于nlogn的,应该是k2,但是由于k<=n,也就是说k是可以等于n的。

先尝试看看能否通过。
每日一题算法:前 K 个高频元素](https://leetcode-cn.com/problems/top-k-frequent-elements/) topKFrequent_第2张图片

        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。

每日一题算法:前 K 个高频元素](https://leetcode-cn.com/problems/top-k-frequent-elements/) topKFrequent_第3张图片

虽然知道了要使用最小堆来做了,但是想了半天不知道最小堆该如何实现了,看来需要去复习一下了。

你可能感兴趣的:(每日一题算法)