算法題: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等,實踐事後纔能有清楚的認識。