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%)
4
2
5
3
class Solution :
6
4
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 ])))
10
9
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 ]))
21
12
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
+
31
33
return ans
0 commit comments