|
4 | 4 |
|
5 | 5 | Quickselect, partition until pivot = k, left side all < k
|
6 | 6 |
|
7 |
| - Time: O(n) -> optimized from O(n log k) max heap solution |
8 |
| - Space: O(1) |
| 7 | + Time: O(k log n) |
| 8 | + Space: O(n) |
9 | 9 | */
|
10 | 10 |
|
11 | 11 | // class Solution {
|
|
29 | 29 | // return result;
|
30 | 30 | // }
|
31 | 31 | // };
|
32 |
| - |
| 32 | +/* |
33 | 33 | class Solution {
|
34 | 34 | public:
|
35 | 35 | vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
|
@@ -72,3 +72,40 @@ class Solution {
|
72 | 72 | return pow(point[0], 2) + pow(point[1], 2);
|
73 | 73 | }
|
74 | 74 | };
|
| 75 | +*/ |
| 76 | + |
| 77 | +/* |
| 78 | +// O(n logn) solution using sorting |
| 79 | +class Solution { |
| 80 | +public: |
| 81 | + vector<vector<int>> kClosest(vector<vector<int>>& points, int k) { |
| 82 | + vector<vector<int>> res(k); |
| 83 | + sort(points.begin(), points.end(), [](vector<int>& p1, vector<int>& p2){ |
| 84 | + int dist_p1 = pow(p1[0],2) + pow(p1[1],2); |
| 85 | + int dist_p2 = pow(p2[0],2) + pow(p2[1],2); |
| 86 | + return dist_p1 < dist_p2; |
| 87 | + }); |
| 88 | + copy(points.begin(), points.begin() + k, res.begin()); |
| 89 | + return res; |
| 90 | + } |
| 91 | +}; |
| 92 | +*/ |
| 93 | + |
| 94 | +// O(k logn) solution |
| 95 | +class Solution { |
| 96 | +public: |
| 97 | + vector<vector<int>> kClosest(vector<vector<int>>& points, int k) { |
| 98 | + vector<vector<int>> triples; |
| 99 | + for (auto& p : points) |
| 100 | + triples.push_back({p[0] * p[0] + p[1] * p[1], p[0], p[1]}); |
| 101 | + // Min heap of vectors (triples). This constructor takes O(n) time (n = len(v)) |
| 102 | + priority_queue<vector<int>, vector<vector<int>>, greater<vector<int>>> pq(triples.begin(), triples.end()); |
| 103 | + vector<vector<int>> res; |
| 104 | + while (k--){ |
| 105 | + vector<int> el = pq.top(); |
| 106 | + pq.pop(); |
| 107 | + res.push_back({el[1], el[2]}); |
| 108 | + } |
| 109 | + return res; |
| 110 | + } |
| 111 | +}; |
0 commit comments