@@ -38,3 +38,46 @@ class Solution {
38
38
return result;
39
39
}
40
40
};
41
+
42
+ // Time: O(nlogn + klogk + klogn)
43
+ // Space: O(n + k)
44
+ class Solution2 {
45
+ public:
46
+ vector<int > closestRoom (vector<vector<int >>& rooms, vector<vector<int >>& queries) {
47
+ static const auto & by_size_asc = [](const auto & a, const auto & b) { return a[1 ] < b[1 ]; };
48
+ sort (begin (rooms), end (rooms), by_size_asc);
49
+ for (int i = 0 ; i < size (queries); ++i) {
50
+ queries[i].emplace_back (i);
51
+ }
52
+ sort (begin (queries), end (queries), by_size_asc);
53
+ set<int > ids;
54
+ for (const auto & room : rooms) {
55
+ ids.emplace (room[0 ]);
56
+ }
57
+ vector<int > result (size (queries), -1 );
58
+ int i = 0 ;
59
+ for (const auto & q : queries) {
60
+ int r = q[0 ], s = q[1 ], idx = q[2 ];
61
+ for (; i < size (rooms) && rooms[i][1 ] < s; ++i) {
62
+ ids.erase (rooms[i][0 ]);
63
+ }
64
+ result[idx] = find_closest (ids, r);
65
+ }
66
+ return result;
67
+ }
68
+
69
+ private:
70
+ int find_closest (const set<int >& ids, int r) {
71
+ int result = -1 , min_diff = numeric_limits<int >::max ();
72
+ auto it = ids.upper_bound (r);
73
+ if (it != begin (ids) && abs (*prev (it) - r) < min_diff) {
74
+ min_diff = abs (*prev (it) - r);
75
+ result = *prev (it);
76
+ }
77
+ if (it != end (ids) && abs (*it - r) < min_diff) {
78
+ min_diff = abs (*it - r);
79
+ result = *it;
80
+ }
81
+ return result;
82
+ }
83
+ };
0 commit comments