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();
}

results matching ""

    No results matching ""