Top K 題目小結

2021-10-13 05:01:16 字數 1121 閱讀 6912

1. 不管是一維陣列還是二維或多維陣列求第k小或第k大元素,如果陣列是無序的,那麼

求第k小的元素就用最大堆,

求第k大的元素就用最小堆。

如果是一維陣列,時間複雜度是o(nlogk)。如果是二維陣列,時間複雜度是o(mnlogk)。

注意,這裡也可以是乙個鍊錶,或者m個鍊錶,做法一樣,時間複雜度也一樣。

2. 不管是一維陣列還是二維或多維陣列求第k小或第k大元素,也可以用quick select演算法。

陣列不需要有序。

如果是一維陣列,時間複雜度是o(n)。如果是二維陣列,時間複雜度是o(mn)。

一維陣列的quick select 見lintcode 80 median

注意,quick select不能用鍊錶。

3. 如果一維陣列是有序的,直接取第k個或第n-k個元素即可。

如果二維陣列每個陣列都是有序的,那麼

求第k小的元素就用最小堆,

求第k大的元素就用最大堆。

如果是二維矩陣,時間複雜度是o(m+klogm)。這裡m是建堆複雜度。

二維陣列的例子見lintcode 1874 kth smallest element in a specific array

4. 如果二維陣列行列都是有序的,那麼

求第k小的元素用最小堆

求第k大的元素用最大堆

以求第k小的元素用最小堆為例,思路是先放matrix[0][0],即最小的那個元素,然後將其pop(),再把它的正下方和右邊的那個元素放進堆,

因為這兩個肯定是僅比top大的那兩個最小的元素。如此反覆,一共pop掉k-1次,並且每次pop掉top後都把它正下方和右方的元素加進來。

時間複雜度o(klogk)。因為迴圈k遍,每次往裡放最多2個數,所以heap最大size是2k,放了最多2k次,pop了k此,時間複雜度o(klogk)。

例子見 lintcode 401. kth smallest number in sorted matrix 

5. 如果是求前k個most frequent的元素呢?光maxheap或minheap還不行,因為我們要記錄每個元素的frequency。

乙個方法是unordered_map + maxheap

另乙個方法是unordered_map + minheap

C 入門題目小結

一 簡述c 記憶體分配方式 在 c 中,記憶體分成 5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1.棧,在執行函式時,函式的引數級函式內區域性變數 的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的...

linux題目小結(二)

guid磁碟分割槽表的縮寫,是硬碟分割槽表的一種。使用支援gpt分割槽表的工具進行硬碟的分割槽,然後格式化分割槽和掛載分割槽就可以使用了。1 block大小為2048,預留空間20 卷標為mydata 2 掛載至 mydata目錄,要求掛載時禁止程式自動執行,且不更新檔案的訪問時間戳 3 可開機自動...

題目小結 網路流

東拼拼,西湊湊,不就又水出一篇部落格嗎?例 1.text 首先可以想到在 1,n 列舉匯點,檢驗最大流是否為企鵝總數。每個點初始的企鵝數可以由 s rightarrow i 的邊表示,那跳出的企鵝呢?因為跳到哪個冰塊是未知的,所以不妨將 i 拆成兩個點 在入點與出點之間連邊權為跳出企鵝數的邊。例 2...