|
1 | 1 | public class Solution {
|
2 |
| - // Closest to origin minHeap |
3 |
| - private PriorityQueue<int[], double> pq; |
4 |
| - private int size; |
5 |
| - // T: O(Max(M, KLogM)), S: O(k) |
6 | 2 | public int[][] KClosest(int[][] points, int k) {
|
7 |
| - pq = new PriorityQueue<int[], double>(); |
8 |
| - size = k; |
9 |
| - |
10 |
| - AddToPriorityQueue(points); |
11 |
| - |
12 |
| - return Closest(); |
13 |
| - } |
14 |
| - |
15 |
| - public class MaxHeap : IComparer<double>{ |
16 |
| - public int Compare(double x, double y){ |
17 |
| - if( x< y) return 1;å |
18 |
| - else if (x > y) return -1; |
19 |
| - else return 0; |
20 |
| - } |
21 |
| - } |
22 |
| - |
23 |
| - // T: O(M) |
24 |
| - private void AddToPriorityQueue(int[][] points){ |
25 |
| - foreach(var point in points){ |
26 |
| - //var value = (double) Math.Sqrt(point[0]*point[0] + point[1]*point[1]); |
27 |
| - var value = (double) point[0]*point[0] + point[1]*point[1]; |
28 |
| - pq.Enqueue(point, value); |
29 |
| - |
30 |
| - |
31 |
| - } |
32 |
| - } |
33 |
| - |
34 |
| - // T: O(KLogM) |
35 |
| - private int[][] Closest(){ |
36 |
| - var result = new List<int[]>(); |
37 |
| - while(size > 0){ |
38 |
| - result.Add(pq.Dequeue()); |
39 |
| - size--; |
| 3 | + var items = points.Select(point => { |
| 4 | + long x = point[0]; |
| 5 | + long y = point[1]; |
| 6 | + |
| 7 | + return (point, x * x + y * y); |
| 8 | + }); |
| 9 | + |
| 10 | + int[][] result = new int[k][]; |
| 11 | + // T: O(n) |
| 12 | + PriorityQueue<int[], long> queue = new(items); |
| 13 | + |
| 14 | + // T: O(k log(n)) |
| 15 | + for (int i = 0; i < k; i++) { |
| 16 | + result[i] = queue.Dequeue(); |
40 | 17 | }
|
41 |
| - |
42 |
| - return result.ToArray(); |
| 18 | + |
| 19 | + return result; |
43 | 20 | }
|
44 | 21 | }
|
0 commit comments