421. Maximum XOR of Two Numbers in an Array
Problem Statement
Given an integer array nums
, return the maximum result of nums[i] XOR nums[j]
, where 0 <= i <= j < n
.
Example 1:
Input: nums = [3,10,5,25,2,8]
Output: 28
Explanation: The maximum result is 5 XOR 25 = 28.
Example 2:
Input: nums = [14,70,53,83,49,91,36,80,92,51,66,70]
Output: 127
Constraints:
1 <= nums.length <= 2 * 105
0 <= nums[i] <= 231 - 1
Intuition
Approach:
Insert all the elements in Trie,
Then, for each element again ,
check if opposite bits exist and move there
This way you generate answer
9 -> 1001
Insert from start-> Start bits are valuable for maximum answer
Links
https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/description/
Video Links
Approach 1:
struct Node{
Node* links[2];
};
class Trie{
public:
Node * root = new Node();
void insert(int num){
Node *temp = root;
for(int i=31; i>=0; i--){
int bit = (num>>i) & 1;
if(temp->links[bit] == nullptr)
temp->links[bit] = new Node();
temp = temp->links[bit];
}
}
int check(int num){
Node* temp = root;
int ans = 0;
for(int i=31; i>=0; i--){
int bit = (num>>i) & 1;
if(temp->links[1-bit] == nullptr){
temp = temp->links[bit];
}
else{
temp = temp->links[1-bit];
ans = ans | 1<<i;
}
}
return ans;
}
};
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
Trie trie;
int ans = 0;
for(auto &it: nums)
trie.insert(it);
for(auto &it: nums)
ans = max(ans, trie.check(it));
return ans;
}
};
Approach 2:
Approach 3:
Approach 4:
Similar Problems
Previous1698-Number of Distinct Substrings in a String Using TrieNext1707. Maximum XOR With an Element From Array
Last updated