用 Python 编写程序,查找数组中元素的最大异或值
假设我们有一个名为 nums 的数组,其中包含非负值。我们还有另一个名为 queries 的数组,其中 queries[i] 有一对 (xi, mi)。第 i 个查询的答案是 xi 和 nums 中任何小于或等于 mi 的元素的最大按位异或值。如果 nums 中的所有元素都大于 mi,则答案为 -1。因此,我们必须找到一个数组 answer,其中 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 := size of nums
n := 查询的大小
查询 = 为每个索引 i 创建一个三元组 (i, x, limit),并在查询中配对 (x, limit)
根据限制对查询进行排序
nums := 对列表 nums 进行排序
res := 大小为 n 的数组并用 0 填充
对于 k 在 31 到 0 的范围内,减少 1,执行
前缀 := 一个新的集合
j := 0
对于查询中的每个索引 i 和值 (x, limit),执行
当 j <= m - 1 时并且 nums[j] <= limit,则执行
将 nums[j] 向右移动 k 位并插入前缀中
j := j + 1
如果前缀为空,则
res[i] := -1
否则,
res[i] = res[i]/2 的商
target := res[i] XOR 1
如果(向右移动 k 位后的 x)XOR target 在前缀中,则
res[i] := 目标
返回 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]
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

