Here is the implementation using a trie:
class TrieNode:
children = [null, null] // 0 and 1
function findMaximumXOR(nums):
root = new TrieNode()
// Insert all numbers
for num in nums:
node = root
for i from 31 down to 0:
bit = (num >> i) & 1
if node.children[bit] == null:
node.children[bit] = new TrieNode()
node = node.children[bit]
maxXor = 0
for num in nums:
node = root
currentXor = 0
for i from 31 down to 0:
bit = (num >> i) & 1
oppositeBit = 1 - bit
if node.children[oppositeBit] != null:
currentXor |= (1 << i)
node = node.children[oppositeBit]
else:
node = node.children[bit]
maxXor = max(maxXor, currentXor)
return maxXor
time, space for trie.