n個數取前k個最小數

 

算法題:K 個最近的點算法

給定一些 points 和一個 origin,從 points 中找到 k 個離 origin 最近的點。按照距離由小到大返回。若是兩個點有相同距離,則按照x值來排序;若x值也相同,就再按照y值排序。數組

格式:排序

第一行輸入一個 points 數組表明要查找的點集,第二行一行輸入一個點 origin 的座標,接下來一行輸入一個 k 值的大小,最後輸出離 origin 最近的 k 個點的座標數組隊列

樣例輸入it

points = [ [4,6] , [4,7] , [4,4] , [2,5] , [1,1]]io

origin = [0, 0]class

k = 3效率

樣例輸出技巧

[ [1,1] , [2,5] , [4,4] ]map

 

第一反應是重點在計算「最近」上,算完以後找最小的k個,內心想了下排序nlogn就一筆帶過了。

可是結合評論思考了一下,發現如何找前k個仍是有些技巧的。

比較有效的方式就是最大/最小堆,堆能夠使複雜度降低到nlogk。

 

1. 最大/最小堆的應用比想象中大不少,不少地方都能使用,且效率高。

2. 勝者樹/敗者樹(k路歸併樹)。與堆的區別:a).堆內每一個節點都是數據點, 勝者樹/敗者樹中只有葉節點是數據點;b)比較次數不一樣。https://www.zhihu.com/question/35144290

3. 樹,圖,二維表,堆,隊列,map/reduce等,實踐事後纔能有清楚的認識。

相關文章
相關標籤/搜索