Java 求解前 K 个高频元素
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解前 K 个高频元素相关的知识,希望对你有一定的参考价值。
一、题目
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
二、优先级队列题解
题目要求得出现频率前 k 高的元素,所以需要求得:
(1)统计元素出现的频率
(2)对频率排序
(3)找出前 K 个高频元素
(1)统计元素的频率,可以采用map记录
(2)对频率排序,可以利用优先级队列对其频率进行排序
优先级队列:就是堆
求前K高频元素:可以对队列从大到小排序
(3)遍历找出前K高频元素
三、代码
import java.util.*;
class Solution
public int[] topKFrequent(int[] nums, int k)
Map<Integer, Integer> map = new HashMap<>();
//统计元素出现的频率
for (int i : nums)
if (map.containsKey(i))
map.put(i, map.get(i) + 1);
else
map.put(i, 1);
//自定义优先级队列,按照频率进行排序,降序
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>()
@Override
public int compare(Integer o1, Integer o2)
return map.get(o2) - map.get(o1);
);
//将所有数字放入队列
for (int i : map.keySet())
queue.add(i);
int[] res = new int[k];
//取出前k个元素
for (int i = 0; i < k; i++)
res[i] = queue.poll();
return res;
四、总结
求频率,考虑 Map
前K高频,考虑优先级队列
同时注意对优先级队列重排序的方式:
//自定义优先级队列,按照频率进行排序,降序
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>()
@Override
public int compare(Integer o1, Integer o2)
return map.get(o2) - map.get(o1);
);
或者精简写法:
Queue<Integer> queue = new PriorityQueue<>(
(a,b)->Integer.compare(map.get(b),map.get(a)));
以上是关于Java 求解前 K 个高频元素的主要内容,如果未能解决你的问题,请参考以下文章