标签:right cur 1707 前缀 异或 queries sorted leetcode left
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
标签:right,cur,1707,前缀,异或,queries,sorted,leetcode,left
来源: https://www.cnblogs.com/iven98/p/15413587.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。