606. 第K大的元素 II

描述

找到數(shù)組中第K大的元素,N遠(yuǎn)大于K

注意事項(xiàng)

你可以改變數(shù)組中元素的位置

樣例

在數(shù)組 [9,3,2,4,8] 中, 第三大的元素是 4。
在數(shù)組 [1,2,3,4,5] 中, 第一大 的元素是 5,第二大 的元素是 4,第三大 的元素是3等等。

思路

用 PriorityQueue 來(lái)實(shí)現(xiàn),PriorityQueue 的大小始終保持在 K 個(gè),遍歷所有數(shù),和 PriorityQueue 中最小數(shù)比較,如果大于最小數(shù),將最小數(shù)拋出 PriorityQueue,當(dāng)前數(shù)加入 PriorityQueue,PriorityQueue 內(nèi)部重新排出最小數(shù),進(jìn)入下一輪比較,等所有數(shù)遍歷完了,PriorityQueue 中最小數(shù)就是第K大的數(shù)。

區(qū)別

首先要強(qiáng)調(diào)下快排,快速排序是一種不穩(wěn)定算法,最好情況下時(shí)間復(fù)雜度為 O(NlogN),最壞情況時(shí)間復(fù)雜度為 O(N^2)
而 quickSelect 是基于快排的另一種算法在 K 和 N 接近時(shí)會(huì)達(dá)到接近 O(N) 的時(shí)間復(fù)雜度,但如果 N >> K 時(shí),快排每次切分都不均勻,可能會(huì)使 quickSelect 算法時(shí)間復(fù)雜度無(wú)法達(dá)到 O(N),最壞可能 O(N^2)
本題和 5.第k大元素 的區(qū)別在于上一題中,K 和 N 在一個(gè)數(shù)量級(jí),用快排來(lái)解題可達(dá)到時(shí)間復(fù)雜度接近 O(N) ,而本題在 K 比較小(N 遠(yuǎn)大于 K)的情況下,優(yōu)先隊(duì)列可以穩(wěn)定實(shí)現(xiàn)時(shí)間復(fù)雜度為 O(NlogK) 的算法
O(NlogK) 在數(shù)量級(jí)上是大于 O(N) 的,不管 K 取多少,當(dāng) K << N 時(shí),快速選擇 O(N) < 優(yōu)先隊(duì)列 O(NlogK) < 快速排序平均 O(NlogN) < 快速排序最壞 O(N^2)

代碼

class Solution {
    /**
     * @param nums an integer unsorted array
     * @param k an integer from 1 to n
     * @return the kth largest element
     */
    public int kthLargestElement2(int[] nums, int k) {
        PriorityQueue<Integer> q = new PriorityQueue<Integer>(k);
        for (int num : nums) {
            q.offer(num);
            if (q.size() > k) {
                q.poll();
            }
        }
        return q.peek();
    }
}

PriorityQueue補(bǔ)充

PriorityQueue 在用 PriorityQueue() 作為構(gòu)造函數(shù)時(shí),默認(rèn)容量是 11
PriorityQueue(int initialCapacity) 作為構(gòu)造函數(shù),會(huì)用 initialCapacity 作為默認(rèn)容量。
優(yōu)先級(jí)隊(duì)列是無(wú)界的,但是有一個(gè)內(nèi)部容量,控制著用于存儲(chǔ)隊(duì)列元素的數(shù)組的大小。它總是至少與隊(duì)列的大小相同。隨著不斷向優(yōu)先級(jí)隊(duì)列添加元素,其容量會(huì)自動(dòng)增加。無(wú)需指定容量增加策略的細(xì)節(jié)。絕大部分的容器都是無(wú)界的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容