前k大的數

2022-02-01 16:45:00 字數 774 閱讀 7598

取前 k 個數,並取出最小值(mi(k) = min(k, n)).

遍歷 第 k+1 ~ n的數,與 mi(k) 比較。若小於 mi(k),遍歷下乙個。若大於 mi(k),放入該值,並移除mi(k)後,再次取出最小值(mi(k) = min(k, n))。

時間複雜度:o(n * k)。

1. 將資料分成三個區間:

(1~k-1, k~m, m+1~n),目標是取出適合於k~m區間的數。

2. 操作 前兩個區間,即 1~k-1 和 k~m:

(1) 找出第k-1大的數:從 1~k-1 中,取最大值(方法很多:冒泡,冒一次;直接選擇,一趟選最大)。ma(k-1) = max(k-1, n)。時間複雜度 o(k-1).

(2) 利用快速排序,對 1~m 進行一次快排(不需要整體有序),1~k-2 大的數會被分到 k-1 的左邊,k~m大的數分到 k-1 的右邊。時間複雜度 o(m).

(3) 從 k~m 中,找出最大值和最小值。ma(m) = max(m, m),mi(k) = min(k, m).時間複雜度 o(2(m-k)).

3. 遍歷 m+1~n 的數(nx = n(x)),與 第 k-1 大的數進行比較.

小於 k-1的數,即nx < ma(k-1),放入左邊;右邊收錄n(k-1),(比較n(k-1)與ma(m),大的數被淘汰出去。受影響的區域,最值從新獲取。時間複雜度 o((n-(m+1))*(k-1)).

時間複雜度(比較複雜):o((n-(m+1))*(k-1)) = (k-1) + m + 2(m-k) + (n-(m+1))*(k-1).

第k大的數,前k大的數

1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...

尋找前k大的數

input 輸入有多個測試用例,每個測試用例是兩行 第1行是兩個整數n和k,中間用空格隔開 n k 第2行有n個整數,每兩個數字中間用空格隔開 輸入以eof結束 output 對於每乙個測試用例,輸出一行,k個整數,就是它的前k大的整數,按照降序排列輸出,每兩個數字之間用空格隔開,最後乙個數字後面沒...

輸出前k大的數

010 輸出前k大的數 總time limit 10000ms 單個測試點時間限制 1000ms memory limit 65536kb description 給定乙個陣列,統計前k大的數並且把這k個數從大到小輸出。input 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n...