973. K Closest Points to Origin

题目

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.)

示例1:

1
2
3
4
5
6
7
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]].

示例2:

1
2
3
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.)

提示:

  1. 1 <= K <= points.length <= 10000
  2. -10000 < points[i][0] < 10000
  3. -10000 < points[i][1] < 10000

解法

解法一:

构造一个小顶堆,取K个即可。

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Point {
int index;
double distance;

public Point(int index, double distance) {
this.index = index;
this.distance = distance;
}

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public double getDistance() {
return distance;
}

public void setDistance(double distance) {
this.distance = distance;
}


}

public int[][] kClosest(int[][] points, int K) {
PriorityQueue<Point> points2 = new PriorityQueue<Point>(K, new Comparator<Point>() {

@Override
public int compare(Point o1, Point o2) {
// TODO Auto-generated method stub
if (o1.getDistance() - o2.getDistance() > 0) {
return 1;
} else if (o1.getDistance() - o2.getDistance() == 0){
return 0;
}
return -1;
}
});

for (int i = 0;i < points.length;i++) {
Point point = new Point(i, Math.sqrt(points[i][0] * points[i][0] + points[i][1] * points[i][1]));
points2.add(point);
}

int[][] result = new int[K][2];
int index = 0;
while (index < K && points2.size() > 0) {
Point point = points2.poll();
result[index][0] = points[point.index][0];
result[index][1] = points[point.index][1];
index++;
}
return result;
}
0%