该题解采用了二进制前缀树(Trie)的思想。从最高位开始,逐位尝试将最大异或值 ans 的当前位设为 1。对于每一位,我们维护一个集合 seen,存储之前遍历过的数在当前位及更高位上的部分。如果能找到一个数,使得它与 newAns 的异或结果在 seen 中,说明 newAns 是可以达到的,我们将 ans 更新为 newAns。
时间复杂度: O(nL)
空间复杂度: O(n)
class Solution:
def findMaximumXOR(self, nums: List[int]) -> int:
# 求最大数的二进制位数
h = max(nums).bit_length()-1
ans = 0
mask = 0
# 从最高位开始遍历
for i in range(h, -1, -1):
# 更新掩码,将当前位设为 1
mask |= 1 << i
seen = set()
# 尝试将 ans 的当前位设为 1
newAns = ans | 1 << i
for num in nums:
# 将 num 的高位部分加入 seen
num &= mask
# 如果 newAns 可以通过异或运算得到,更新 ans
if (newAns ^ num) in seen:
ans = newAns
break
seen.add(num)
return ans