Giả sử chúng ta có một danh sách các số num và một danh sách các truy vấn trong đó mỗi truy vấn chứa [x, giới hạn]. Chúng ta phải tìm một danh sách sao cho mỗi truy vấn [x, limit], chúng ta tìm thấy một phần tử e trong nums sao cho e ≤ giới hạn và e XOR x là cực đại. Nếu không có phần tử như vậy, hãy trả về -1.
Vì vậy, nếu đầu vào giống như nums =[3, 5, 9] queries =[[4, 6], [2, 0]], thì đầu ra sẽ là [3, -1], như đối với truy vấn đầu tiên, chúng ta có thể sử dụng 2 hoặc 4 trong nums. 3 ^ 4 =7 trong khi 5 ^ 4 =3 vì vậy chúng tôi chọn 3 sẽ mang lại XOR lớn hơn. Trong truy vấn thứ hai, không có số nào nhỏ hơn hoặc bằng 0, vì vậy chúng tôi đặt nó thành -1.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
trie:=a new map
-
Định nghĩa một hàm bit (). Điều này sẽ mất tôi
-
trả về biểu diễn nhị phân 32 bit của i
-
Xác định một chèn chức năng. Điều này sẽ mất tôi
-
nút:=trie
-
đối với mỗi c tính bằng bit (i), thực hiện
-
node:=nếu c không có trong node, hãy chèn một bản đồ trống vào bên trong nó
-
-
nút [2]:=i
-
Xác định một truy vấn hàm (). Điều này sẽ mất tôi
-
nút:=trie
-
đối với mỗi c tính bằng bit (i), thực hiện
-
rc:=c XOR 1
-
node:=node [rc] nếu tồn tại, nếu không, node [c]
-
-
nút trả về [2]
-
Từ phương thức chính, hãy làm như sau -
-
sắp xếp danh sách A
-
B:=danh sách các phần tử ở dạng (i, x, giới hạn) cho mỗi chỉ mục truy vấn i và các giá trị truy vấn x và giới hạn. Sau đó, sắp xếp nó dựa trên giới hạn
-
(j, n, ans):=(0, kích thước của A, danh sách có kích thước giống như truy vấn, điền bằng -1)
-
đối với mỗi chỉ số i và giá trị x và giới hạn trong B, thực hiện
-
while j
-
chèn (A [j])
-
j:=j + 1
-
-
nếu j khác 0 thì
-
ans [i]:=query (x)
-
-
-
trả lại ans
Ví dụ (Python)
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn -
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))
Đầu vào
[3, 5, 9], [[4, 6],[2, 0]]
Đầu ra
[3, -1]