Maximum XOR of Two Numbers in an Array

medium array hash map bit manipulation trie

Problem

Given an integer array nums, return the maximum result of nums[i] XOR nums[j] over all pairs. Aim for O(n log V) time.

Inputnums = [3, 10, 5, 25, 2, 8]
Output28
5 XOR 25 = 28.

def find_maximum_xor(nums):
    ans = mask = 0
    for bit in range(31, -1, -1):
        mask |= (1 << bit)
        prefixes = {x & mask for x in nums}
        cand = ans | (1 << bit)
        for p in prefixes:
            if (cand ^ p) in prefixes:
                ans = cand
                break
    return ans
function findMaximumXOR(nums) {
  let ans = 0, mask = 0;
  for (let bit = 31; bit >= 0; bit--) {
    mask |= (1 << bit);
    const prefixes = new Set(nums.map(x => x & mask));
    const cand = ans | (1 << bit);
    for (const p of prefixes) {
      if (prefixes.has(cand ^ p)) { ans = cand; break; }
    }
  }
  return ans;
}
class Solution {
    public int findMaximumXOR(int[] nums) {
        int ans = 0, mask = 0;
        for (int bit = 31; bit >= 0; bit--) {
            mask |= (1 << bit);
            Set<Integer> prefixes = new HashSet<>();
            for (int x : nums) prefixes.add(x & mask);
            int cand = ans | (1 << bit);
            for (int p : prefixes) if (prefixes.contains(cand ^ p)) { ans = cand; break; }
        }
        return ans;
    }
}
int findMaximumXOR(vector<int>& nums) {
    int ans = 0, mask = 0;
    for (int bit = 31; bit >= 0; bit--) {
        mask |= (1 << bit);
        unordered_set<int> prefixes;
        for (int x : nums) prefixes.insert(x & mask);
        int cand = ans | (1 << bit);
        for (int p : prefixes) if (prefixes.count(cand ^ p)) { ans = cand; break; }
    }
    return ans;
}
Time: O(n · log V) Space: O(n)