尋找區間內第k小的數

2022-06-20 08:30:25 字數 950 閱讀 3980

這是最直接暴力的方法,時間複雜度為\(o(nlog_n)\)

直接排序,輸出第k小的值即可

#include #include using namespace std;

const int n = 1e5 + 10;

int n, k;

int a[n];

int main()

時間複雜度的計算主要關注左右兩個指標的移動,總次數為\(n+\frac+\frac + ...\),所以時間複雜度為\(o(n)\)

具體內容請見快速排序引申出的快速選擇演算法

因為需要遍歷每個元素\(o(n)\),且每個元素插入堆中的複雜度為\(o(log_n)\),所以時間複雜度為\(o(nlog_n)\),實際使用應該用不到,這裡只是記錄一種思想

本以為可以使用對頂堆解決這個問題,但是搞錯了對頂堆的應用場景,然後誤打誤撞的發現大根堆也可以解決

假設尋找的為第k小的數,遍歷所有數,將小於堆頂的資料插入堆,並始終維護堆的大小為k,最終堆頂元素即為第k小的數

我總是擔心更小的資料會將目標元素提前彈出堆,但這種情況是不會發生的,假設能夠發生這種情況,那麼說明被彈出的目標元素在公升序序列中是第k位之前的,所以才會因為堆滿而被彈出。因為目標元素就是第k小的,所以我們的假設錯誤。因為沒有進入堆的元素在有序序列中均是第k位之後的,所以最終堆頂元素就是有序序列中前k位元素最大的元素,即第k小的元素

#include #include #include using namespace std;

const int n = 1e5 + 10;

int n, k;

int a[n];

int kth_element(int a, int l, int r, int k)

return down.top();

}int main()

尋找第K小的數

尋找第k小的數屬於順序統計學範疇,通常我們可以直接在o nlgn 的時間內找到第k小的數,使用歸併排序或者堆排序對輸入資料按從小到大進行排序,然後選擇第k個即可。然而,我們還有更好的演算法。首先來看乙個簡單的問題,在乙個有n個元素的集合中,需要多少次比較才能確定其最小值呢?這可以很容易退出需要n 1...

尋找第K小的數

description輸入n個數,求其中第k小的數。思路 採用快排求解,如下 include include include include partition的作用是將小於povit的元素放左邊,大於povit的元素放右邊 intpartition int arr,int left,int rig...

尋找第K大的數

題目描述 要求在n個不重複的整數中,找出第k大的整數 其中0輸入第一行為兩個正整數n k 第二行為n個整數,輸入保證這n個整數兩兩相異,每個整數的範圍在 1000000到1000000之間 輸出輸出第k大的整數值 樣例輸入 5 33 2 4 5 1 樣例輸出 3 如下 include include...