今天分享乙個小技巧,雖然是小技巧但是還是很有價值的,曾經是微軟的面試題。題目是這樣的,乙個無序的陣列讓你找出第k小的元素,我當時看到這道題的時候也像很多人一樣都是按普通的思維,先排序在去第k個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人剛開始非常熱衷於各種排序演算法只是了解卻沒深究,這個題目的複雜度是o(n),原理就是快速排序裡面的劃分演算法。
分析:快速排序選擇乙個pivot對陣列進行劃分,左邊小於pivot,右邊大於等於pivot,所以我們計算左邊小於pivot(加上pivot)的個數count總共有多少,如果等於k,正是我們所要的,如果大於k,說明第k小的數在左邊,那就在左邊進行我們的遞迴;否則,在右邊,那麼說明右邊的第k-count小的數就是我們所要的,在右邊進行我們的遞迴。
**如下:
1 #include"stdio.h"2
int getmink(int a,int n,int
k) 3
17 a[i]=temp;
18 s=i;
1920
21if(s==k)
22return
a[k];
23if(s>k) //
在左側尋找
24if(s//
在右側尋找
25}
26}
27int
main()
28;
30int k=3
; 31 printf("
第%d小元素為:(從0開始)\n%d
",k,getmink(a,10
,k));
32return
0;
33 }
查詢第k小的元素 O n 遞迴解法
今天分享乙個小技巧,雖然是小技巧但是還是很有價值的,曾經是微軟的面試題。題目是這樣的,乙個無序的陣列讓你找出第k小的元素,我當時看到這道題的時候也像很多人一樣都是按普通的思維,先排序在去第k個,但是當陣列非常大的時候,效率不高,那有沒有簡單的方法了,其實我們早就學過,只是我們不善於思考和變通。很多人...
QuickSelect 查詢第 K 小的元素
quick select演算法通常用來在未排序的陣列中尋找第 k 小 第 k 大的元素。其方法類似於quick sort。本質上是通過多次快速排序,當某次快速排序的樞紐元素恰好下標為 k 1 時,結束查詢 package main import fmt func core nums int,k,st...
有序矩陣中第K小的元素(通俗解法)
給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。通俗解法 先降維,二維降維一維,然後用sort進行排序,最...