本题解的核心是使用字典树(Trie)针对整数进行位操作的优化存储。首先,将数组nums排序并对查询数组queries按m值排序以方便处理。对于每个查询(xi, mi),我们将nums中所有不大于mi的元素插入到Trie中。之后,我们使用Trie树的getMaxXor函数来找到与xi进行XOR操作可以获得的最大值。如果没有任何元素被插入到Trie中(即所有nums元素均大于mi),则返回-1。
时间复杂度: O((n + q) * L)
空间复杂度: O(nL)
class Trie:
L = 30 # 最多30位二进制数字
def __init__(self):
self.left = None # 左子树表示0
self.right = None # 右子树表示1
def insert(self, val: int):
node = self
for i in range(Trie.L, -1, -1): # 从高位到低位处理
bit = (val >> i) & 1 # 获取当前位的值
if bit == 0:
if not node.left:
node.left = Trie() # 如果左节点不存在,则创建
node = node.left
else:
if not node.right:
node.right = Trie() # 如果右节点不存在,则创建
node = node.right
def getMaxXor(self, val: int) -> int:
ans, node = 0, self
for i in range(Trie.L, -1, -1):
bit = (val >> i) & 1
check = False
if bit == 0:
if node.right:
node = node.right
check = True
else:
node = node.left
else:
if node.left:
node = node.left
check = True
else:
node = node.right
if check:
ans |= 1 << i # 如果对应位能够匹配到期望的异或结果,设置结果位
return ans
class Solution:
def maximizeXor(self, nums: List[int], queries: List[List[int]]) -> List[int]:
n, q = len(nums), len(queries)
nums.sort() # 排序nums
queries = sorted([(x, m, i) for i, (x, m) in enumerate(queries)], key=lambda query: query[1]) # 按mi排序查询
ans = [0] * q
t = Trie()
idx = 0
for x, m, qid in queries: # 处理每一个查询
while idx < n and nums[idx] <= m:
t.insert(nums[idx]) # 插入符合条件的nums元素
idx += 1
if idx == 0:
ans[qid] = -1 # 如果没有可用元素,返回-1
else:
ans[qid] = t.getMaxXor(x) # 计算最大XOR值
return ans