题意:给出一个数组,求出前k个出现频率最多的数
思路:首先统计每个元素的次数(用Map),然后用堆排序只统计前k个(PriorityQueue)
代码如下:
class Solution
{
class Pair implements Comparable<Pair>
{
int key, value;
public int compareTo(Pair b)
{
return value - b.value;
}
}
public List<Integer> topKFrequent(int[] nums, int k)
{
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++)
{
if (map.containsKey(nums[i]))
{
map.put(nums[i], map.get(nums[i]) + 1);
}
else
{
map.put(nums[i], 1);
}
}
Comparator<Pair> cmp = new Comparator<Pair>()
{
public int compare(Pair a, Pair b)
{
return a.value - b.value;
}
};
Queue<Pair> queue = new PriorityQueue<Pair>(k, cmp);
for(Map.Entry<Integer, Integer> ele: map.entrySet())
{
Pair p = new Pair();
p.key = ele.getKey(); p.value = ele.getValue();
if (queue.size() < k)
{
queue.add(p);
}
else
{
if (p.compareTo(queue.peek()) > 0)
{
queue.poll();
queue.offer(p);
}
}
}
List<Integer> res = new ArrayList<Integer>();
while (!queue.isEmpty())
{
Pair p = queue.poll();
res.add(p.key);
}
Collections.sort(res);
return res;
}
}