此问题在此处已有答案:
Understanding Java's List.sort() with a comparator [duplicate](3个答案)
上个月关闭。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
if (k == nums.length) {
return nums;
}
Map<Integer, Integer> count = new HashMap();
for (int n: nums) {
count.put(n, count.getOrDefault(n, 0) + 1);
}
Queue<Integer> heap = new PriorityQueue<>(
(n1, n2) -> count.get(n1) - count.get(n2));
for (int n: count.keySet()) {
heap.add(n);
if (heap.size() > k) heap.poll();
}
int[] top = new int[k];
for(int i = k - 1; i >= 0; --i) {
top[i] = heap.poll();
}
return top;
}
}
因此这是对LeetCode问题之一答案,以找到前k个频繁元素。Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
如果不是用于缩短版本,如何编写(n1,n2)-〉count. get(n1)- count.get(n2)?
1条答案
按热度按时间5n0oy7gb1#
您使用的是
PriorityQueue
构造函数,它将一个Comparator作为参数,目的是按如下方式确定优先级:如果它具有较小的“计数”值,则它应该在队列中较早出现(优先级较高)。我猜在旧java中你可以这样做:
返回值的解释如下:如果为负数,则意味着
n1
在n2
之前。如果为正数,则n1
在0
之后。如果0
,则它们相等或至少相对而言处于同一“级别”。传递哪个负数并不重要。a - b
是“如果a较小,则a在b之前”的一种俗气的表达方式。如果你有很大的数字,这可能是危险的--大概这在这里不适用。更好的写法应该是:
这更清楚地说明了您要尝试 * 做 * 的事情,也就是,对调用
count.get()
的结果进行优先级排序,将队列中的内容作为参数传递。