मान लीजिए कि कमरे नामक एक सरणी है। जहां कमरे [i] में एक जोड़ी होती है [roomId_i, size_i] उस कमरे को दर्शाता है जिसकी आईडी RoomId_i है और आकार size_i है। सभी कमरों के नंबर अलग-अलग हैं। हमारे पास एक और सरणी क्वेरीज़ भी हैं, जहाँ क्वेरीज़ [j] में एक जोड़ी [preferred_j, minSize_j] शामिल है। jth क्वेरी का उत्तर एक कमरे का कमरा नंबर आईडी है जैसे -
-
कमरे का आकार कम से कम minSize_j है, और
-
|आईडी - वरीय_जे| कम किया गया है।
अब अगर निरपेक्ष अंतर में एक टाई है, तो सबसे छोटी आईडी वाले कमरे का उपयोग करें। अगर ऐसा कोई कमरा नहीं है, तो वापसी -1। इसलिए हमें उत्तर नामक एक सरणी ढूंढनी होगी जिसकी लंबाई प्रश्नों के समान हो, जिसमें jth क्वेरी का उत्तर हो।
तो, अगर इनपुट कमरे की तरह है =[[2,2], [1,2], [3,2]] प्रश्न =[[3,1], [3,3], [5,2]], तो आउटपुट [3, -1, 3] होगा क्योंकि
-
पूछताछ के लिए [3,1]:कमरा 3 सबसे नज़दीक है क्योंकि |3 - 3| =0, और इसका आकार 2 कम से कम 1 है, इसलिए उत्तर 3 है।
-
क्वेरी के लिए [3,3]:ऐसा कोई कमरा नहीं है जिसका आकार कम से कम 3 हो, इसलिए उत्तर -1 है।
-
पूछताछ के लिए [5,2]:कमरा 3 सबसे नज़दीक है क्योंकि |3 - 5| =2, और इसका आकार 2 कम से कम 2 है, तो उत्तर 3 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
आकार के आधार पर कमरों को छाँटें, जब आकार समान हो तो कमरे की आईडी के आधार पर
-
query =युग्मों की सूची (qid, size, i) अनुक्रमणिका i के लिए, और युग्म (qid, size) प्रश्नों में
-
आकार के आधार पर प्रश्नों को उल्टे क्रम में क्रमबद्ध करें, यदि आकार समान हैं, तो पसंदीदा के आधार पर, जब दोनों समान हों तो अनुक्रमणिका के आधार पर
-
उत्तर:=प्रश्नों के आकार के समान आकार की एक सरणी और -1 से भरें
-
एक्स:=एक नई सूची
-
प्रश्नों में प्रत्येक (qid, आकार, i) के लिए, करें
-
जबकि कमरे और कमरों के अंतिम आइटम का आकार>=आकार, करते हैं
-
(idr, p) :=कमरों से अंतिम तत्व हटा दिया गया
-
Idr डालने के बाद X को सॉर्ट करें
-
-
अगर X खाली नहीं है, तो
-
j :=अनुक्रमणिका जहाँ X क्रमित रहने के लिए qid सम्मिलित करना है
-
यदि j, X के आकार के समान है, तो
-
ans[i] :=X का अंतिम तत्व
-
-
अन्यथा जब j, 0 के समान हो, तब
-
ans[i] :=X[0]
-
-
अन्यथा,
-
अगर X[j] - qid
-
Ans[i] :=X[j]
-
-
अन्यथा,
-
ans[i] :=X[j-1]
-
-
-
-
-
वापसी उत्तर
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें
import bisect
def solve(rooms, queries):
rooms.sort(key = lambda x: (x[1], x[0]))
queries = [(qid,size,i) for i, (qid, size) in enumerate(queries)]
queries.sort(key = lambda x: (x[1], x[0], x[2]), reverse = True)
ans = [-1] * len(queries)
X = []
for qid, size, i in queries:
while rooms and rooms[-1][1] >= size:
idr, _ = rooms.pop()
bisect.insort(X, idr)
if X:
j = bisect.bisect(X, qid)
if j == len(X):
ans[i] = X[-1]
elif j == 0:
ans[i] = X[0]
else:
if X[j] - qid < qid - X[j-1]:
ans[i] = X[j]
else:
ans[i] = X[j-1]
return ans
rooms = [[2,2],[1,2],[3,2]]
queries = [[3,1],[3,3],[5,2]]
print(solve(rooms, queries)) इनपुट
[[2,2],[1,2],[3,2]], [[3,1],[3,3],[5,2]]
आउटपुट
[3, -1, 3]