# Minimum XOR Value Pair

• Difficulty Level : Hard
• Last Updated : 11 Mar, 2022

Given an array of integers. Find the pair in an array that has a minimum XOR value.
Examples :

```Input : arr[] =  {9, 5, 3}
Output : 6
All pair with xor value (9 ^ 5) => 12,
(5 ^ 3) => 6, (9 ^ 3) => 10.
Minimum XOR value is 6

Input : arr[] = {1, 2, 3, 4, 5}
Output : 1 ```

A Simple Solution is to generate all pairs of the given array and compute XOR their values. Finally, return minimum XOR value. This solution takes O(n2) time.

## C++

 `// C++ program to find minimum XOR value in an array.``#include ``using` `namespace` `std;` `// Returns minimum xor value of pair in arr[0..n-1]``int` `minXOR(``int` `arr[], ``int` `n)``{``    ``int` `min_xor = INT_MAX; ``// Initialize result` `    ``// Generate all pair of given array``    ``for` `(``int` `i = 0; i < n; i++)``        ``for` `(``int` `j = i + 1; j < n; j++)` `            ``// update minimum xor value if required``            ``min_xor = min(min_xor, arr[i] ^ arr[j]);` `    ``return` `min_xor;``}` `// Driver program``int` `main()``{``    ``int` `arr[] = { 9, 5, 3 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << minXOR(arr, n) << endl;``    ``return` `0;``}`

## Java

 `// Java program to find minimum XOR value in an array.``class` `GFG {` `    ``// Returns minimum xor value of pair in arr[0..n-1]``    ``static` `int` `minXOR(``int` `arr[], ``int` `n)``    ``{``        ``int` `min_xor = Integer.MAX_VALUE; ``// Initialize result` `        ``// Generate all pair of given array``        ``for` `(``int` `i = ``0``; i < n; i++)``            ``for` `(``int` `j = i + ``1``; j < n; j++)` `                ``// update minimum xor value if required``                ``min_xor = Math.min(min_xor, arr[i] ^ arr[j]);` `        ``return` `min_xor;``    ``}` `    ``// Driver program``    ``public` `static` `void` `main(String args[])``    ``{``        ``int` `arr[] = { ``9``, ``5``, ``3` `};``        ``int` `n = arr.length;``        ``System.out.println(minXOR(arr, n));``    ``}``}``// This code is contributed by Sumit Ghosh`

## Python3

 `# Python program to find minimum``# XOR value in an array.` `# Function to find minimum XOR pair``def` `minXOR(arr, n):``    ` `    ``# Sort given array``    ``arr.sort();` `    ``min_xor ``=` `999999``    ``val ``=` `0` `    ``# calculate min xor of``    ``# consecutive pairs``    ``for` `i ``in` `range` `(``0``, n``-``1``):``        ``for` `j ``in` `range` `(i``+``1``, n``-``1``):``            ` `            ``# update minimum xor value``            ``# if required``            ``val ``=` `arr[i] ^ arr[j]``            ``min_xor ``=` `min``(min_xor, val)``    ``return` `min_xor` `# Driver program``arr ``=` `[ ``9``, ``5``, ``3` `]``n ``=` `len``(arr)` `print``(minXOR(arr, n))` `# This code is contributed by Sam007.`

## C#

 `// C# program to find minimum``// XOR value in an array.``using` `System;` `class` `GFG {``    ` `    ``// Returns minimum xor value of``    ``// pair in arr[0..n-1]``    ``static` `int` `minXOR(``int``[] arr, ``int` `n)``    ``{``         ``// Initialize result``        ``int` `min_xor = ``int``.MaxValue;` `        ``// Generate all pair of given array``        ``for` `(``int` `i = 0; i < n; i++)``            ``for` `(``int` `j = i + 1; j < n; j++)` `            ``// update minimum xor value if required``            ``min_xor = Math.Min(min_xor, arr[i] ^ arr[j]);` `        ``return` `min_xor;``    ``}` `    ``// Driver program``    ``public` `static` `void` `Main()``    ``{``        ``int``[] arr = { 9, 5, 3 };``        ``int` `n = arr.Length;``        ``Console.WriteLine(minXOR(arr, n));``    ``}``}` `// This code is contributed by Sam007`

## PHP

 ``

## Javascript

 ``

Output:

`6`

An Efficient solution can solve this problem in O(nlogn) time. Below is the algorithm:

```1). Sort the given array
2). Traverse and check XOR for every consecutive pair```

Below is the implementation of above approach:

## C++

 `#include ``using` `namespace` `std;` `// Function to find minimum XOR pair``int` `minXOR(``int` `arr[], ``int` `n)``{``    ``// Sort given array``    ``sort(arr, arr + n);` `    ``int` `minXor = INT_MAX;``    ``int` `val = 0;` `    ``// calculate min xor of consecutive pairs``    ``for` `(``int` `i = 0; i < n - 1; i++) {``        ``val = arr[i] ^ arr[i + 1];``        ``minXor = min(minXor, val);``    ``}` `    ``return` `minXor;``}` `// Driver program``int` `main()``{``    ``int` `arr[] = { 9, 5, 3 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << minXOR(arr, n) << endl;` `    ``return` `0;``}`

## Java

 `import` `java.util.Arrays;``class` `GFG {` `    ``// Function to find minimum XOR pair``    ``static` `int` `minXOR(``int` `arr[], ``int` `n)``    ``{``        ``// Sort given array``        ``Arrays.parallelSort(arr);` `        ``int` `minXor = Integer.MAX_VALUE;``        ``int` `val = ``0``;` `        ``// calculate min xor of consecutive pairs``        ``for` `(``int` `i = ``0``; i < n - ``1``; i++) {``            ``val = arr[i] ^ arr[i + ``1``];``            ``minXor = Math.min(minXor, val);``        ``}` `        ``return` `minXor;``    ``}` `    ``// Driver program``    ``public` `static` `void` `main(String args[])``    ``{``        ``int` `arr[] = { ``9``, ``5``, ``3` `};``        ``int` `n = arr.length;``        ``System.out.println(minXOR(arr, n));``    ``}``}` `// This code is contributed by Sumit Ghosh`

## Python3

 `import` `sys   ` `# Function to find minimum XOR pair``def` `minXOR(arr, n):``    ` `    ``# Sort given array``    ``arr.sort()`` ` `    ``minXor ``=`  `int``(sys.float_info.``max``)``    ``val ``=` `0`` ` `    ``# calculate min xor of consecutive pairs``    ``for` `i ``in` `range``(``0``,n``-``1``):``        ``val ``=` `arr[i] ^ arr[i ``+` `1``];``        ``minXor ``=` `min``(minXor, val);``    ` `    ``return` `minXor` `# Driver program``arr ``=` `[``9``, ``5``, ``3``]``n ``=` `len``(arr)``print``(minXOR(arr, n))`` ` `# This code is contributed by Sam007.`

## C#

 `// C# program to find minimum``// XOR value in an array.``using` `System;` `class` `GFG {``    ` `    ``// Function to find minimum XOR pair``    ``static` `int` `minXOR(``int``[] arr, ``int` `n)``    ``{``        ``// Sort given array``        ``Array.Sort(arr);` `        ``int` `minXor = ``int``.MaxValue;``        ``int` `val = 0;` `        ``// calculate min xor of consecutive pairs``        ``for` `(``int` `i = 0; i < n - 1; i++) {``            ``val = arr[i] ^ arr[i + 1];``            ``minXor = Math.Min(minXor, val);``        ``}` `        ``return` `minXor;``    ``}` `    ``// Driver program``    ``public` `static` `void` `Main()``    ``{``        ``int``[] arr = { 9, 5, 3 };``        ``int` `n = arr.Length;``        ``Console.WriteLine(minXOR(arr, n));``    ``}``}` `// This code is contributed by Sam007`

## PHP

 ``

## Javascript

 ``

Output :

`6`

Time Complexity: O(N*logN)
Space Complexity: O(1)
Thanks to Utkarsh Gupta for suggesting above approach.
A further more Efficient solution can solve the above problem in O(n) time under the assumption that integers take fixed number of bits to store. The idea is to use Trie Data Structure. Below is algorithm.

```1). Create an empty trie. Every node of trie contains two children
for 0 and 1 bits.
2). Initialize min_xor = INT_MAX, insert arr[0] into trie
3). Traversal all array element one-by-one starting from second.
a. First find minimum setbet difference value in trie
do xor of current element with minimum setbit diff that value
b. update min_xor value if required
c. insert current array element in trie
4). return min_xor
```

Below is the implementation of above algorithm.

## C++

 `// C++ program to find minimum XOR value in an array.``#include ``using` `namespace` `std;``#define INT_SIZE 32` `// A Trie Node``struct` `TrieNode {``    ``int` `value; ``// used in leaf node``    ``TrieNode* Child[2];``};` `// Utility function to create a new Trie node``TrieNode* getNode()``{``    ``TrieNode* newNode = ``new` `TrieNode;``    ``newNode->value = 0;``    ``newNode->Child[0] = newNode->Child[1] = NULL;``    ``return` `newNode;``}` `// utility function insert new key in trie``void` `insert(TrieNode* root, ``int` `key)``{``    ``TrieNode* temp = root;` `    ``// start from the most significant bit, insert all``    ``// bit of key one-by-one into trie``    ``for` `(``int` `i = INT_SIZE - 1; i >= 0; i--) {``        ``// Find current bit in given prefix``        ``bool` `current_bit = (key & (1 << i));` `        ``// Add a new Node into trie``        ``if` `(temp->Child[current_bit] == NULL)``            ``temp->Child[current_bit] = getNode();` `        ``temp = temp->Child[current_bit];``    ``}` `    ``// store value at leafNode``    ``temp->value = key;``}` `// Returns minimum XOR value of an integer inserted``// in Trie and given key.``int` `minXORUtil(TrieNode* root, ``int` `key)``{``    ``TrieNode* temp = root;` `    ``for` `(``int` `i = INT_SIZE - 1; i >= 0; i--) {``        ``// Find current bit in given prefix``        ``bool` `current_bit = (key & (1 << i));` `        ``// Traversal Trie, look for prefix that has``        ``// same bit``        ``if` `(temp->Child[current_bit] != NULL)``            ``temp = temp->Child[current_bit];` `        ``// if there is no same bit.then looking for``        ``// opposite bit``        ``else` `if` `(temp->Child[1 - current_bit] != NULL)``            ``temp = temp->Child[1 - current_bit];``    ``}` `    ``// return xor value of minimum bit difference value``    ``// so we get minimum xor value``    ``return` `key ^ temp->value;``}` `// Returns minimum xor value of pair in arr[0..n-1]``int` `minXOR(``int` `arr[], ``int` `n)``{``    ``int` `min_xor = INT_MAX; ``// Initialize result` `    ``// create a True and insert first element in it``    ``TrieNode* root = getNode();``    ``insert(root, arr[0]);` `    ``// Traverse all array element and find minimum xor``    ``// for every element``    ``for` `(``int` `i = 1; i < n; i++) {``        ``// Find minimum XOR value of current element with``        ``// previous elements inserted in Trie``        ``min_xor = min(min_xor, minXORUtil(root, arr[i]));` `        ``// insert current array value into Trie``        ``insert(root, arr[i]);``    ``}``    ``return` `min_xor;``}` `// Driver code``int` `main()``{``    ``int` `arr[] = { 9, 5, 3 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << minXOR(arr, n) << endl;``    ``return` `0;``}`

## Java

 `// Java program to find minimum XOR value in an array.``class` `GFG {``    ``static` `final` `int` `INT_SIZE = ``32``;` `    ``// A Trie Node``    ``static` `class` `TrieNode {``        ``int` `value; ``// used in leaf node``        ``TrieNode[] Child = ``new` `TrieNode[``2``];` `        ``public` `TrieNode()``        ``{``            ``value = ``0``;``            ``Child[``0``] = ``null``;``            ``Child[``1``] = ``null``;``        ``}``    ``}``    ``static` `TrieNode root;` `    ``// utility function insert new key in trie``    ``static` `void` `insert(``int` `key)``    ``{``        ``TrieNode temp = root;` `        ``// start from the most significant bit, insert all``        ``// bit of key one-by-one into trie``        ``for` `(``int` `i = INT_SIZE - ``1``; i >= ``0``; i--) {``            ``// Find current bit in given prefix``            ``int` `current_bit = (key & (``1` `<< i)) >= ``1` `? ``1` `: ``0``;` `            ``// Add a new Node into trie``            ``if` `(temp != ``null` `&& temp.Child[current_bit] == ``null``)``                ``temp.Child[current_bit] = ``new` `TrieNode();` `            ``temp = temp.Child[current_bit];``        ``}` `        ``// store value at leafNode``        ``temp.value = key;``    ``}` `    ``// Returns minimum XOR value of an integer inserted``    ``// in Trie and given key.``    ``static` `int` `minXORUtil(``int` `key)``    ``{``        ``TrieNode temp = root;` `        ``for` `(``int` `i = INT_SIZE - ``1``; i >= ``0``; i--) {``            ``// Find current bit in given prefix``            ``int` `current_bit = (key & (``1` `<< i)) >= ``1` `? ``1` `: ``0``;` `            ``// Traversal Trie, look for prefix that has``            ``// same bit``            ``if` `(temp.Child[current_bit] != ``null``)``                ``temp = temp.Child[current_bit];` `            ``// if there is no same bit.then looking for``            ``// opposite bit``            ``else` `if` `(temp.Child[``1` `- current_bit] != ``null``)``                ``temp = temp.Child[``1` `- current_bit];``        ``}` `        ``// return xor value of minimum bit difference value``        ``// so we get minimum xor value``        ``return` `key ^ temp.value;``    ``}` `    ``// Returns minimum xor value of pair in arr[0..n-1]``    ``static` `int` `minXOR(``int` `arr[], ``int` `n)``    ``{``        ``int` `min_xor = Integer.MAX_VALUE; ``// Initialize result` `        ``// create a True and insert first element in it``        ``root = ``new` `TrieNode();``        ``insert(arr[``0``]);` `        ``// Traverse all array element and find minimum xor``        ``// for every element``        ``for` `(``int` `i = ``1``; i < n; i++) {``            ``// Find minimum XOR value of current element with``            ``// previous elements inserted in Trie``            ``min_xor = Math.min(min_xor, minXORUtil(arr[i]));` `            ``// insert current array value into Trie``            ``insert(arr[i]);``        ``}``        ``return` `min_xor;``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String args[])``    ``{``        ``int` `arr[] = { ``9``, ``5``, ``3` `};``        ``int` `n = arr.length;``        ``System.out.println(minXOR(arr, n));``    ``}``}``// This code is contributed by Sumit Ghosh`

## Python

 `# class for the basic Trie Node``class` `TrieNode:``    ``def` `__init__(``self``):` `        ``# Child array with 0 and 1``        ``self``.child ``=` `[``None``]``*``2` `        ``# meant for the lead Node``        ``self``.value ``=` `None` `class` `Trie:` `    ``def` `__init__(``self``):``        ``# initialise the root Node``        ``self``.root ``=` `self``.getNode()` `    ``def` `getNode(``self``):``        ``# get a new Trie Node``        ``return` `TrieNode()` `    ``# inserts a new element``    ``def` `insert(``self``,key):``        ``temp ``=` `self``.root`` ` `        ``# 32 bit valued binary digit``        ``for` `i ``in` `range``(``31``,``-``1``,``-``1``):` `            ``# finding the bit at ith position``            ``curr ``=` `(key>>i)&(``1``)` `            ``# if the child is None create one``            ``if``(temp.child[curr] ``is` `None``):``                ``temp.child[curr] ``=` `self``.getNode()``            ``temp ``=` `temp.child[curr]` `        ``# add value to the leaf node``        ``temp.value ``=` `key` `    ``# traverse the trie and xor with the most similar element``    ``def` `xorUtil(``self``,key):``        ``temp ``=` `self``.root` `        ``# 32 bit valued binary digit``        ``for` `i ``in` `range``(``31``,``-``1``,``-``1``):` `            ``# finding the bit at ith position``            ``curr ``=` `(key>>i)&``1` `            ``# traverse for the same bit``            ``if``(temp.child[curr] ``is` `not` `None``):``                ``temp ``=` `temp.child[curr]` `            ``# traverse if the same bit is not set in trie``            ``else` `if``(temp.child[``1``-``curr] ``is` `not` `None``):``                ``temp ``=` `temp.child[``1``-``curr]` `        ``# return with the xor of the value``        ``return` `temp.value^key``            ` `        ` `def` `minXor(arr):` `        ``# set m to a large number``        ``m ``=` `2``*``*``30` `        ``# initialize Trie``        ``trie ``=` `Trie()` `        ``# insert the first element``        ``trie.insert(arr[``0``])` `        ``# for each element in the array``        ``for` `i ``in` `range``(``1``,``len``(arr)):` `            ``# find the minimum xor value``            ``m ``=` `min``(m,trie.xorUtil(arr[i]))``            ` `            ``# insert the new element``            ``trie.insert(arr[i])``        ``return` `m` `# Driver Code``if` `__name__``=``=``"__main__"``:``    ``sample ``=` `[``9``,``5``,``3``]``    ``print``(minXor(sample))` `#code contributed by Ashwin Bhat   `

Output:

`6`

Time Complexity O(n)
This article is contributed by Nishant_Singh (Pintu). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.