在Python中查找与数组中元素的最大异或的程序
假设我们有一个名为nums的具有非负值的数组。我们还有另一个名为queries的数组,其中queries[i]具有一对(xi,mi)。第i个查询的答案是xi与小于或等于mi的nums中的任何元素的最大按位异或值。如果nums中的所有元素都大于mi,则答案为-1。因此,我们必须找到一个大小与查询大小相同的数组answer,并且answer[i]是第i次查询的答案。
因此,如果输入为nums = [0,1,2,3,4]和queries = [[3,1],[1,3],[5,6]],则输出将是[3,3,7],因为
- 0和1不大于1。0 XOR 3 = 3,1 XOR 3 = 2,其中这两项较大的是3。
-
1 XOR 2 = 3。
-
5 XOR 2 = 7。
为了解决这个问题,我们将遵循以下步骤 –
- m:nums的大小
-
n:查询的大小
-
针对每个索引i,并将(x,limit)对作为查询制作一个三元组(i,x,limit)
-
基于限制对查询进行排序
-
nums:对列表nums进行排序
-
res:大小为n的数组,并用0填充
-
对于范围从31到0,每次递减的k,执行以下操作 –
- prefixes:一个新集合
-
j = 0
-
对于查询中的每个索引i和值(x,limit),执行以下操作 –
- 在j<=m-1且 nums[j] <= limit的情况下,执行以下操作 –
-
将nums[j]向右移动k位并插入prefixes中
-
j = j + 1
-
如果前缀为空,则
-
res[i] = -1
-
否则,
-
res[i] = res[i] / 2的商
-
target = res[i] XOR 1
-
如果将x右移k位后的值XOR目标位于前缀中,则
- res[i] = target
- 返回res
示例:
让我们看以下实现以更好地理解
def solve(nums, queries):
m, n = len(nums), len(queries)
queries = sorted(((i, x, limit) for i, (x, limit) in
enumerate(queries)), key=lambda x: x[2])
nums = sorted(nums)
res = [0] * n
for k in range(31, -1, -1):
prefixes = set()
j = 0
for i, x, limit in queries:
while j <= m - 1 and nums[j] <= limit:
prefixes.add(nums[j] >> k)
j += 1
if not prefixes:
res[i] = -1
else:
res[i] <<= 1
target = res[i] ^ 1
if (x >> k) ^ target in prefixes:
res[i] = target
return res
nums = [0,1,2,3,4]
queries = [[3,1],[1,3],[5,6]]
print(solve(nums, queries))
输入:
[0,1,2,3,4], [[3,1],[1,3],[5,6]]
输出:
[3, 3, 7]