/** * Definition for a point. * class Point { * int x; * int y; * Point() { x = 0; y = 0; } * Point(int a, int b) { x = a; y = b; } * }*/publicclassSolution{/** * @parampoints a list of points * @paramorigin a point * @paramk an integer * @return the k closest points*/privateclassPointWithDist{int[] coord;int distance;publicPointWithDist(intx,inty,intdist){this.coord=newint[2];this.coord[0]= x;this.coord[1]= y;this.distance= dist;}}publicPoint[]kClosest(Point[]points,Pointorigin,intk){ // 维持一个最大堆,大小为k,保存距离最小的k个点PriorityQueue<PointWithDist> pq =newPriorityQueue<>(k,newComparator<PointWithDist>(){@Override // 重写compare方法解决比较的主要次要key的问题publicintcompare(PointWithDistp1,PointWithDistp2){if(p1.distance!=p2.distance){returnp2.distance-p1.distance;}elseif(p1.coord[0]!=p2.coord[0]){returnp2.coord[0]-p1.coord[0];}else{returnp2.coord[1]-p1.coord[1];}}});for(Point p : points){PointWithDist pwd =newPointWithDist(p.x,p.y,(int)(Math.pow((p.x-origin.x),2)+Math.pow((p.y-origin.y),2))); // 重点!!! 这里的写法很简洁,限制了pq的size,即如果size大于k,则poll掉当前最大(保留k个最小的)pq.offer(pwd);if(pq.size()> k)pq.poll();}Point[] res =newPoint[k];for(int i =0; i< k;++i){PointWithDist pwd =pq.poll(); res[k - i -1]=newPoint(pwd.coord[0],pwd.coord[1]);}return res;}}
# Definition for a point.
# class Point:
# def __init__(self, a=0, b=0):
# self.x = a
# self.y = b
class Solution:
# @param {Pint[]} points a list of points
# @param {Point} origin a point
# @param {int} k an integer
# @return {Pint[]} the k closest points
def kClosest(self, points, origin, k):
def getDist(point):
return (point.x - origin.x) **2 + (point.y - origin.y) **2
import heapq
pq = []
for point in points:
dist = getDist(point)
key = (-dist, -point.x, -point.y, point) # max heap,主次key和element
heapq.heappush(pq, key)
if len(pq) > k:
heapq.heappop(pq)
res = []
for i in range(len(pq)):
res.append(heapq.heappop(pq)[3])
return res[::-1]