Kth largest element
要找出陣列中第 k 大的元素,直觀想法是 sort 後找第 k-1 個元素,
可是這樣不夠快,我們想要在 O(n) 級別就找到,於是我們可以兩種方法:
第一種是 quick select,就是 quick sort 的 partition 那步驟,請注意題意,要想清楚
第 k 大並不是第 k 個,而是從大到小排序的第 k 個
quick select 方法就在另一篇
這題也可以用 PriorityQueue 做,我們維持一個 min PriorityQueue,
因為將數字依序放入 PriorityQueue 會進行排序,全部都放入就會得到一個排序好的結果
那要找第 k 大的話就是從後面數過第 k 個,
所以我們再放入時,當這個 heap 的大小超過 k ,就刪掉最前面的元素,讓大小維持在 k
塞完後取得第一個就是第 k 大元素
public int kthLargestElement(int n, int[] nums) {
PriorityQueue<Integer> q = new PriorityQueue<>();
for (int num : nums) {
q.offer(num);
if (q.size() > n)
q.poll();
}
return q.poll();
}