件名の説明:
タイトル215:を参照してもよいです
方法の一つ:ソート
クラスソリューション: DEF kClosest(自己、ポイント:リスト[リストの[int]、K:INT) - > リスト[リスト[INT]: points.sort(キー = ラムダ P:P [0] ** 2 + P [1] ** 2 ) リターンポイント[:K]
クイックエキゾースト+の分割統治:
クラスのソリューション: DEF kClosest(セルフは、ポイント:リストを[一覧[INT]]、K:INT) - > 一覧[一覧[INT]: #はユークリッド距離を計算する 距離= ラムダ I:ポイント[I]を[0 ] ** 2 + [I]ポイント[1] ** 2はDEF (I、J、K)を動作: IF I> J: リターン#1 レコード初期値 OI、OJ = I、J #のテイクセンチネル値は、左端のある ピボット= 距離(OI) しばらく私は=!J: しばらくは私が<J との距離(J)> = ピボット: J - = 1。 一方、 IはJ < との距離(I)<= ピボット: I。+ = 1 IF Iに< J: #の交換値 ポイント[I]、ポイント[J] = ポイント[j]は、ポイント[I] #の交換センチネル ポイント[I]、ポイント[OI] = ポイントは、[OI]は、[I]ポイント #の再帰を IF K <=私は- OI + 1。 :# は半分ソートまま 作業(OI、私は- 1。、K) 他: #の右ソート半分 ワーク(I + 1は、OJ、K - (私は- OI + 1 )) の仕事(0、LEN(ポイント) - 1 、K) リターンポイント[:K]
方法3:ヒープソート
heapqのインポートheappush、heappop クラスソリューション: DEF kClosest(自己、ポイント:リスト[リストの[int]、K:INT) - > リスト[リスト[INT]: キュー = [] 距離 = ラムダ X:ポイント[X ] [0] ** 2つの+ポイント[X] [1] ** 2 長 = LEN(ポイント) のための I における範囲(長さ): heappush(キュー、(距離(I)、ポイント[I])) RES = [] のための I における範囲(K): res.append(heappop(キュー)[ 1]) 戻り RES