Skip to content

Commit 7d7ec84

Browse files
committed
Runtime: 1741 ms (Top 100.0%) | Memory: 67.86 MB (Top 93.7%)
1 parent aae0e97 commit 7d7ec84

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
1-
# Runtime: 3555 ms (Top 46.27%) | Memory: 66.7 MB (Top 10.45%)
2-
3-
from sortedcontainers import SortedList
1+
# Runtime: 1741 ms (Top 100.0%) | Memory: 67.86 MB (Top 93.7%)
42

53
class Solution:
64
def closestRoom(self, rooms: List[List[int]], queries: List[List[int]]) -> List[int]:
7-
rooms.sort(key=lambda x: x[1], reverse=True) # Sort by decreasing order of room size
8-
qArr = [[i, q] for i, q in enumerate(queries)] # Zip queries with their index
9-
qArr.sort(key=lambda x: x[1][1], reverse=True) # Sort by decreasing order of query minSize
5+
ans = [0] * len(queries)
6+
7+
# sort queries to handle largest size queries first
8+
q = deque(sorted([(size, room, i) for i, (room, size) in enumerate(queries)], key=lambda a: (-a[0], a[1], a[2])))
109

11-
def searchClosestRoomId(preferredId):
12-
if len(roomIdsSoFar) == 0:
13-
return -1
14-
cands = []
15-
i = roomIdsSoFar.bisect_right(preferredId)
16-
if i > 0:
17-
cands.append(roomIdsSoFar[i - 1])
18-
if i < len(roomIdsSoFar):
19-
cands.append(roomIdsSoFar[i])
20-
return min(cands, key=lambda x: abs(x - preferredId))
10+
# sort rooms by descending size
11+
rooms = deque(sorted(rooms, key=lambda x: -x[1]))
2112

22-
roomIdsSoFar = SortedList()
23-
n, k = len(rooms), len(queries)
24-
i = 0
25-
ans = [-1] * k
26-
for index, (prefferedId, minSize) in qArr:
27-
while i < n and rooms[i][1] >= minSize:
28-
roomIdsSoFar.add(rooms[i][0]) # Add id of the room which its size >= query minSize
29-
i += 1
30-
ans[index] = searchClosestRoomId(prefferedId)
13+
# current available room ids
14+
cands = []
15+
16+
17+
while q:
18+
size, room, i = q.popleft()
19+
# add room ids to candidates as long as top of room size meet the requirements
20+
while rooms and rooms[0][1] >= size:
21+
bisect.insort(cands, rooms.popleft()[0])
22+
23+
# if no room size available, return -1
24+
if not cands: ans[i] = -1
25+
26+
# else use bisect to find optimal room ids
27+
else:
28+
loc = bisect.bisect_left(cands, room)
29+
if loc == 0: ans[i] = cands[loc]
30+
elif loc == len(cands): ans[i] = cands[-1]
31+
else: ans[i] = cands[loc - 1] if room - cands[loc - 1] <= cands[loc] - room else cands[loc]
32+
3133
return ans

0 commit comments

Comments
 (0)