此题算是字典树的一道比较好的应用题。从最高位开始,一点点比较,这样可以找到异或值最大的那个数。
class Solution {
struct node
{
int end = 0;
node *next[2];
};
struct Trie
{
node *start = new node();
void insert(int num)
{
node *curr = start;
for(int i=30;i>=0;i--)
{
int nxt = num >= (1<<i);
if(!curr->next[nxt])curr->next[nxt] = new node();
curr = curr->next[nxt];
if(nxt)num -= (1<<i);
}
}
int search(int val)
{
node *curr = start;
int ans = 0, base;
for(int i=30;i>=0;i--)
{
base = 1<<i;
int p = val >= base;
if(curr->next[!p])
{
ans = ans*2 + (!p);
curr = curr->next[!p];
}
else
{
ans = ans*2 + p;
curr = curr->next[p];
}
if(p)val -= base;
}
return ans;
}
};
public:
int findMaximumXOR(vector<int>& nums) {
auto t = Trie();
for(auto num: nums)t.insert(num);
int ans = 0;
for(auto num: nums)
{
ans = max(ans, num^t.search(num));
}
return ans;
}
};