输入:arr={2, 2, 2, 2, 3, 3, 3, 1},k = 2;
输出:[3,2];
利用PrioriQueue的特性和Map的数据结构,返回前k个高频元素。
- public static void main(String[] args) {
- List<Integer> firstKNums = getFirstKNums(new int[]{2, 2, 2, 2, 3, 3, 3, 1}, 2);
- System.out.println(firstKNums);
- }
-
- public static List<Integer> getFirstKNums(int[] arr, int k) {
- Map<Integer, Integer> map = Maps.newHashMap();
- for (int i = 0; i < arr.length; i++) {
- if (map.containsKey(arr[i])) {
- map.put(arr[i], map.get(arr[i]) + 1);
- } else {
- map.put(arr[i], 1);
- }
- }
- LinkedList<Integer> link = new LinkedList<>();
-
- PriorityQueue priorityQueue = new PriorityQueue<Map.Entry>((entry1,entry2)->
- Integer.valueOf(entry1.getValue().toString())-Integer.parseInt(entry2.getValue().toString())
- );
- for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
- priorityQueue.offer(entry);
- }
- if (priorityQueue.size()>k) {
- priorityQueue.poll();
- }
- for (int i = k; i >0; i--) {
- link.add(((Map.Entry<Integer, Integer>)priorityQueue.poll()).getKey());
- }
- return link;
- }