【Leetcode】Top K Frequent Elements

来源:互联网 发布:淘宝海外集运怎么用 编辑:程序博客网 时间:2024/05/29 18:46

题目链接:https://leetcode.com/problems/top-k-frequent-elements/

Given a non-empty array of integers, return the k most frequent elements.

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note:

You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.

思路:

  1. 定义一个类 保存一个num的值和频率,并实现比较方法

  2. 遍历数组,并用hashMap保存各个数字出现的频率

  3. 对hashmap的value集合排序,获取频率最高的k位

算法:

    public List<Integer> topKFrequent(int[] nums, int k) {        List<Integer> res = new ArrayList<Integer>();        Map<Integer,FEntity> map = new HashMap<Integer,FEntity>();        //统计各数字出现的次数 存入hashmap        for(int t:nums){            FEntity f;            if(map.containsKey(t)){                f = map.get(t);                f.frequent++;            }else{                f = new FEntity(t, 1);            }            map.put(t, f);        }        //对hashmap的value 按照频率进行排序        List<FEntity> values = new ArrayList<FEntity>();        Set<Integer> keys = map.keySet();        for(Integer key:keys){            values.add(map.get(key));        }        Collections.sort(values);        //统计频率最高的k个数        for(int i=0;i<k;i++){            res.add(values.get(values.size()-1-i).num);        }        return res;    }    class FEntity implements Comparable<FEntity> {        int num, frequent;        public FEntity(int num, int frequent) {            this.num = num;            this.frequent = frequent;        }        public int compareTo(FEntity arg0) {            if (frequent > arg0.frequent)                return 1;            else if (frequent == arg0.frequent)                return 0;            else                return -1;        }    }
1 1
原创粉丝点击