मान लीजिए कि हमें संख्याओं की एक सूची और दूसरा मान k दिया गया है। इस बार हमारा कार्य सबसे लंबे अनुक्रम की लंबाई ज्ञात करना है जहां प्रत्येक आसन्न तत्व के बीच पूर्ण अंतर अधिकतम k है।
इसलिए, यदि इनपुट nums =[5, 6, 2, 1, −6, 0, −1, k =4 जैसा है, तो आउटपुट 6 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन अपडेट () को परिभाषित करें। इसमें i, x लगेगा
-
मैं :=मैं + एन
-
जबकि i गैर-शून्य है, करें
-
segtree[i] :=अधिकतम segtree[i], x
-
मैं :=मैं / 2
-
-
फ़ंक्शन क्वेरी () को परिभाषित करें। यह मैं, जम्मू ले जाएगा
-
उत्तर :=−अनंतता
-
मैं :=मैं + एन
-
जे:=जे + एन + 1
-
जबकि i
-
अगर मैं मॉड 2 1 के समान है, तो
-
उत्तर:=अधिकतम उत्तर, segtree[i]
-
मैं :=मैं + 1
-
-
अगर j mod 2 1 के समान है, तो
-
जे:=जे - 1
-
उत्तर:=अधिकतम उत्तर, segtree[j]
-
-
मैं :=मैं / 2
-
जे:=जे/2
-
-
वापसी उत्तर
-
अब, मुख्य कार्य में, निम्न कार्य करें -
-
अंक =[5, 6, 2, 1, −6, 0, −1]
-
कश्मीर =4
-
n =2 से घात (लघुगणक आधार 2 ((अंकों की लंबाई) + 1) + 1)
-
सेगट्री :=[0] * 100000
-
snums :=सूची संख्या क्रमित करें
-
अनुक्रमणिका :=एक संग्रह बनाएँ जहाँ x:i प्रत्येक अनुक्रमणिका के लिए i और तत्व x in (snums)
-
उत्तर :=0
-
अंकों में प्रत्येक x के लिए, करें
-
lo :=snums से बाईं ओर की स्थिति लौटाएं, जहां (x - k) क्रमबद्ध क्रम को बनाए रखते हुए डाला जा सकता है
-
hi :=(snums से सबसे बाईं ओर की स्थिति, जहां (x + k) क्रमबद्ध क्रम को बनाए रखते हुए डाला जा सकता है) - 1
-
गिनती:=क्वेरी (लो, हाय)
-
अद्यतन (सूचकांक [x], गिनती + 1)
-
उत्तर:=अधिकतम उत्तर, गिनती + 1
-
-
वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
import math, bisect class Solution: def solve(self, nums, k): n = 2 ** int(math.log2(len(nums) + 1) + 1) segtree = [0] * 100000 def update(i, x): i += n while i: segtree[i] = max(segtree[i], x) i //= 2 def query(i, j): ans = −float("inf") i += n j += n + 1 while i < j: if i % 2 == 1: ans = max(ans, segtree[i]) i += 1 if j % 2 == 1: j −= 1 ans = max(ans, segtree[j]) i //= 2 j //= 2 return ans snums = sorted(nums) index = {x: i for i, x in enumerate(snums)} ans = 0 for x in nums: lo = bisect.bisect_left(snums, x − k) hi = bisect.bisect_right(snums, x + k) − 1 count = query(lo, hi) update(index[x], count + 1) ans = max(ans, count + 1) return ans ob = Solution() print(ob.solve([5, 6, 2, 1, −6, 0, −1], 4))
इनपुट
[5, 6, 2, 1, −6, 0, −1], 4
आउटपुट
6