สมมติว่าเรามีรายการตัวเลขและรายการข้อความค้นหาที่แต่ละข้อความค้นหามี [x, จำกัด] เราต้องหารายชื่อที่สำหรับแต่ละข้อความค้นหา [x, limit] เราพบองค์ประกอบ e เป็น nums ซึ่ง e ≤ limit และ e XOR x ถูกขยายให้ใหญ่สุด หากไม่มีองค์ประกอบดังกล่าว ให้คืนค่า -1
ดังนั้น หากอินพุตเป็น nums =[3, 5, 9] คำสั่ง =[[4, 6],[2, 0]] ผลลัพธ์จะเป็น [3, -1] สำหรับข้อความค้นหาแรก เราสามารถใช้ 2 หรือ 4 ในจำนวน 3 ^ 4 =7 ในขณะที่ 5 ^ 4 =3 ดังนั้นเราจึงเลือก 3 ซึ่งให้ XOR ที่ใหญ่กว่า ในแบบสอบถามที่สอง ไม่มีตัวเลขดังกล่าวที่น้อยกว่าหรือเท่ากับ 0 ดังนั้นเราจึงตั้งค่าเป็น -1
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
พยายาม :=แผนที่ใหม่
-
กำหนดฟังก์ชัน bits() นี่จะใช้เวลาฉัน
-
ส่งคืนการแสดงไบนารี 32 บิตของ i
-
กำหนดฟังก์ชันแทรก นี่จะใช้เวลาฉัน
-
โหนด :=พยายาม
-
สำหรับแต่ละ c เป็นบิต (i) ทำ
-
node :=ถ้า c ไม่อยู่ใน node ให้แทรก map เปล่าเข้าไป
-
-
โหนด[2] :=ผม
-
กำหนดฟังก์ชั่น query() นี่จะใช้เวลาฉัน
-
โหนด :=พยายาม
-
สำหรับแต่ละ c เป็นบิต (i) ทำ
-
rc :=c XOR 1
-
โหนด :=โหนด[rc] ถ้ามีอยู่มิฉะนั้น node[c]
-
-
โหนดกลับ[2]
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
เรียงลำดับรายการ A
-
B :=รายการองค์ประกอบในรูปแบบ (i, x, ขีด จำกัด ) สำหรับดัชนีการค้นหาแต่ละรายการ i และค่าการสืบค้น x และขีดจำกัด แล้วจัดเรียงตามขีดจำกัด
-
(j, n, ans) :=(0, size of A , รายการขนาดเดียวกับการสืบค้น, เติมด้วย -1)
-
สำหรับแต่ละดัชนี i และค่า x และขีดจำกัดใน B ให้ทำ
-
ในขณะที่ j
-
แทรก(A[j])
-
เจ :=เจ + 1
-
-
ถ้า j ไม่ใช่ศูนย์ แล้ว
-
ตอบ[i] :=แบบสอบถาม(x)
-
-
-
กลับมาอีกครั้ง
ตัวอย่าง (Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution: def solve(self, A, queries): trie = {} def bits(i): return map(int, bin(i)[2:].zfill(32)) def insert(i): node = trie for c in bits(i): node = node.setdefault(c, {}) node[2] = i def query(i): node = trie for c in bits(i): rc = c ^ 1 node = node.get(rc, node.get(c)) return node[2] A.sort() B = sorted([(i, x, limit) for i, (x, limit) in enumerate(queries)], key=lambda x: x[2]) j, n, ans = 0, len(A), [-1] * len(queries) for i, x, limit in B: while j < n and A[j] <= limit: insert(A[j]) j += 1 if j: ans[i] = query(x) return ans ob = Solution() nums = [3, 5, 9] queries = [ [4, 6], [2, 0] ] print(ob.solve(nums, queries))
อินพุต
[3, 5, 9], [[4, 6],[2, 0]]
ผลลัพธ์
[3, -1]