We have a list of points on the plane. Find the K closest points to the origin (0, 0).
(Here, the distance between two points on a plane is the Euclidean distance.)
You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in.)
Example 1:
Input: points = [[1,3],[-2,2]], K = 1
Output: [[-2,2]]
Explanation:
The distance between (1, 3) and the origin is sqrt(10).
The distance between (-2, 2) and the origin is sqrt(8).
Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.
We only want the closest K = 1 points from the origin, so the answer is just [[-2,2]].
Example 2:
Input: points = [[3,3],[5,-1],[-2,4]], K = 2
Output: [[3,3],[-2,4]]
(The answer [[-2,4],[3,3]] would also be accepted.)
将二维数组封装成Point对象,然后将每个Point放入大小为K的大堆中,最后,大堆中留下的就是最近距离的Point。
class Solution {
public int[][] kClosest(int[][] points, int K) {
if (points == null || points.length == 0) {
return null;
}
PriorityQueue<Point> maxHeap = new PriorityQueue<>(
(o1, o2) -> Integer.compare(o2._dest, o1._dest));
for (int i = 0; i < points.length; i++) {
int x = points[i][0];
int y = points[i][1];
int dest = x * x + y * y;
maxHeap.add(new Point(x,y,dest));
if (maxHeap.size() > K) {
maxHeap.poll();
}
}
int[][] result = new int[maxHeap.size()][2];
int i = 0;
for (Point p : maxHeap) {
result[i][0] = p._x;
result[i][1] = p._y;
i++;
}
return result;
}
private class Point {
int _x;
int _y;
int _dest;
public Point(int x, int y, int dest) {
_x = x;
_y = y;
_dest = dest;
}
}
}