leetcode-1707 与数组中元素的最大异或值
解题思路
利用前缀树解决,方法同leetcode421,leetcode421是在整个前缀树中寻找异或值最大的那个值,本题是在小于m的前缀树中对应异或最大的值。
因为queries数组是无序的,如果采用暴力方法+前缀树,则每次查询需要重新构建一次前缀树
在421题的基础上,我们可以对nums数组和queries数组排序,这样可以保证每次寻找的数字比上次的数字大,对于前缀树而言,只需要往数中添加元素即可。对queries排序时,需要保存其原来的索引,在求解出结果后根据索引恢复结果。
代码
class TreeNode:
def __init__(self,left=None,right=None):
self.left=left
self.right=right
class Solution:
def maximizeXor(self, nums, queries):
root=TreeNode()
def add(n):
cur=root
x=0
for k in range(30,-1,-1):
bit=(n>>k)&1
if bit==0:
if not cur.left:
cur.left=TreeNode()
cur=cur.left
else:
if not cur.right:
cur.right=TreeNode()
cur=cur.right
def check(num):
cur=root
if not cur.left and not cur.right:
return -1
x=0
for i in range(30,-1,-1):
bit=(num>>i)&1
if bit==0:
if cur.right:
cur=cur.right
x=x*2+1
else:
cur=cur.left
x*=2
else:
if cur.left:
cur=cur.left
x=x*2+1
else:
cur=cur.right
x*=2
return x
nums.sort()
for i in range(len(queries)):
queries[i].append(i)
queries_sorted=sorted(queries,key=lambda x:x[1])
length=len(nums)
cur=0
res_sorted=[]
for item in queries_sorted:
while cur<length and nums[cur]<=item[1]:
add(nums[cur])
cur+=1
res_sorted.append(check(item[0]))
res=[0]*len(res_sorted)
for i in range(len(res_sorted)):
res[queries_sorted[i][2]]=res_sorted[i]
return res