這個問題在這里已經有了答案: 用比較器理解 Java 的 List.sort() [重復] 3 個答案 2 小時前關閉。
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;
}
}
所以這是對尋找前 k 個頻繁元素的 leetcode 問題之一的答案。
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
如果不是縮短版本, (n1, n2) -> count.get(n1) - count.get(n2) 怎么寫?
uj5u.com熱心網友回復:
您正在使用將Comparator 作為引數PriorityQueue
的建構式。目的是按如下方式對事物進行優先級排序:如果它的“計數”值較小,那么它應該在佇列中更早出現(優先級更高)。
我猜在舊的java中你可以這樣做:
Queue<Integer> heap = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer n1, Integer n2) {
return count.get(n1) - count.get(n2);
}
});
回傳值解釋如下:如果為負,則表示n1
在之前n2
。如果是肯定的,n1
就會出現。如果0
它們相等或至少相對處于相同的“水平”。您傳遞的負數無關緊要。a - b
'如果 a 較小,a 在 b 之前' 是一種俗氣的方式,如果你有非常大的數字,可能會很危險 - 大概這不適用于這里。
寫這個的更好的方法是:
new PriorityQueue<>(Comparator.comparingInt(count::get));
這更清楚地說明了您要做什么,即優先考慮呼叫的結果count.get()
,將佇列中的事物作為引數傳遞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/521545.html
標籤:爪哇