這個題目可以作為練習寫大/小根堆的實現,不過貌似時間複雜度還是蠻高的。在洛谷上面一道模板題上面好像就超時了幾個點,不知道是不是我實現的問題。那麼除此之外,最容易想到的方法是先對該陣列進行排序,然後取出第k或max-k數來。當選擇使用快排的時候,時間複雜度是$o(nlogn)$。但還有一種更優的方法是利用快排劃分出來的主元位置再遞迴尋找,這種方法叫作隨機選擇演算法。它對任何輸入都可以達到$o(n)$的期望時間複雜度。
#include #include#include
//隨機選擇主元 其實也是快排的一種寫法
int randpartition(int a,int left,int
right)
a[left] =temp;
return
left;
} //
遞迴實現查詢k值
int randselect(int a,int left,int right,int
k)
無序陣列中找第K個的數
題目分析 也就是從小往大排,第k小那個數。方法1 排序 nlogn 方法2 利用堆 nlogk 首先將前k個元素構建最大堆,堆頂是前k個元素中第k小的元素。這步複雜度klogk 遍歷剩餘元素 這步複雜度 n k logk 如果新元素 堆頂 堆頂不可能是第k大元素 移除堆頂 將新元素插入堆 否則 新元...
試用O n 來實現求出乙個無序陣列的中位數
對於這個問題我起初就想到了多數派問題 那麼受這個問題的影響,我就先到了一種方法 就是建立乙個中間判斷元素。left right 兩個計數器來記錄,通過遍歷陣列的過程中,每次都是嘗試兩邊的元素數量盡量相同,在這個過程中,如果右邊多,那麼就讓下個元素分配在左邊,同理亦然 那麼用 實現就是簡單的 left...
無序數字中位數 如何在無序陣列中查詢第K小的值
如題 給定乙個無序陣列,如何查詢第k小的值。例子如下 在乙個無序陣列,查詢 k 3 小的數 輸入 arr 輸出 7在乙個無序陣列,查詢 k 4 小的數 輸入 arr 輸出 10幾種思路如下和複雜度分析如下 1 最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k 1索引的值即可,時間複雜度為...