[LintCode] K Closest Points

Given some points and a point origin in two dimensional space, find k points out of the some points which are nearest to origin.
Return these points sorted by distance, if they are same with distance, sorted by x-axis, otherwise sorted by y-axis.

Example

Given points = [[4,6],[4,7],[4,4],[2,5],[1,1]], origin = [0, 0], k = 3
return [[1,1],[2,5],[4,4]]

 
 
Solution 1. PriorityQueue with Comparable Interface 
 1 /**
 2  * Definition for a point.
 3  * class Point {
 4  *     int x;
 5  *     int y;
 6  *     Point() { x = 0; y = 0; }
 7  *     Point(int a, int b) { x = a; y = b; }
 8  * }
 9  */
10 class PointWithDistance implements Comparable<PointWithDistance> {
11     protected Point p;
12     protected long d;
13     public PointWithDistance(Point p, long d)
14     {
15         this.p = p;
16         this.d = d;
17     }
18     public int compareTo(PointWithDistance b)
19     {
20             int ret = 0;
21             if(this.d < b.d)
22             {
23                 ret = -1;
24             }
25             else if(this.d > b.d)
26             {
27                 ret =  1;
28             }
29             else
30             {
31                 if(this.p.x < b.p.x)
32                 {
33                     ret = -1;
34                 }
35                 else if(this.p.x > b.p.x)
36                 {
37                     ret = 1;
38                 }
39                 else if(this.p.y < b.p.y)
40                 {
41                     ret = -1;
42                 }
43                 else if(this.p.y > b.p.y)
44                 {
45                     ret = 1;
46                 }
47                 
48             }
49             return ret;
50     }
51 }
52 public class Solution {
53     /**
54      * @param points a list of points
55      * @param origin a point
56      * @param k an integer
57      * @return the k closest points
58      */
59     public Point[] kClosest(Point[] points, Point origin, int k) {
60         if(points == null || points.length == 0 || k <= 0)
61         {
62             return new Point[0];
63         }
64         Point[] results = new Point[k];
65         PriorityQueue<PointWithDistance> pq = new PriorityQueue<PointWithDistance>(points.length);
66         for(int i = 0; i < points.length; i++)
67         {
68             long dist = calcDist(origin, points[i]);
69             pq.add(new PointWithDistance(points[i], dist));
70         }
71         
72         for(int i = 0; i < k; i++)
73         {
74             results[i] = pq.poll().p;
75         }
76         return results;
77     }
78     private long calcDist(Point a, Point b)
79     {
80         return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
81     }
82 }
 
Solution 2. PriorityQueue with the Comparator class
 1 public class Solution {
 2     public Point[] kClosest(Point[] points, Point origin, int k) {
 3         if(points == null || points.length == 0 || k <= 0)
 4         {
 5             return new Point[0];
 6         }
 7         Comparator<Point> comp = new Comparator<Point>(){
 8             public int compare(Point p1, Point p2) {
 9                 long dist1 = calcDist(p1, origin);
10                 long dist2 = calcDist(p2, origin);
11                 if(dist1 < dist2) {
12                     return -1;
13                 }
14                 else if(dist1 > dist2) {
15                     return 1;
16                 }
17                 else if(p1.x < p2.x) {
18                     return -1;
19                 }
20                 else if(p1.x > p2.x) {
21                     return 1;
22                 }
23                 else if(p1.y < p2.y) {
24                     return -1;
25                 }
26                 else if(p1.y > p2.y) {
27                     return 1;
28                 }
29                 return 0;
30             }
31         };
32         Point[] results = new Point[k];
33         PriorityQueue<Point> pq = new PriorityQueue<Point>(points.length, comp);
34         for(int i = 0; i < points.length; i++)
35         {
36             pq.add(points[i]);
37         }
38         
39         for(int i = 0; i < k; i++)
40         {
41             results[i] = pq.poll();
42         }
43         return results;
44     }
45     private long calcDist(Point a, Point b)
46     {
47         return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
48     }
49 }
 
 
Related Problems
K Closest Numbers In Sorted Array
 
原文地址:https://www.cnblogs.com/lz87/p/7494006.html