221 场周赛
1
nothing
2
优先级队列
3
模拟
4
这个题目挺有意思的。
首先是一个离线的查询,那么可以排序。
用01字典树可以贪心的选择出当前数组的抑或的最大值。
字典树。对数字可以用01树来二进制字典树来表示,这样可以快速查找出最大值
class Solution:
def maximizeXor(self, nums: List[int], queries: List[List[int]]) -> List[int]:
i = 0
res = [-1]*len(queries)
# 数据结构:字典树:
tmp = []
depth = len(bin(max(nums)))-2
# 添加元素:
def push(nums_i):
nums_i = nums[i]
cur = tmp
for d in range(31,-1,-1):
if not cur:
cur.append([])
cur.append([])
cur = cur[(nums_i>>d)&1] # 按每一位的值插入元素;
cur.append(nums_i)
# 求解:
def maxXor(x):
if not tmp:return -1
cur = tmp
for d in range(31,-1,-1):
choice = (x>>d)&1^1 # 根据每一位确定选择的子节点;
if(not cur[choice]):# 不能选择没有插入元素的空节点。
choice^=1
cur = cur[choice]
return x^cur[0]
# 过程:
nums.sort()
for p,(x,m) in sorted(enumerate(queries), key = lambda x:x[1][1]):
while(i<len(nums) and nums[i]<=m):
push(nums[i])
i+=1
res[p] = maxXor(x)
return res
作者:simpleson
链接:https://leetcode-cn.com/problems/maximum-xor-with-an-element-from-array/solution/lin-chang-si-lu-chi-xian-zi-dian-shu-by-k2ezf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。