在Python中查找与数组中元素的最大异或的程序

在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]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程