力扣1707. 与数组中元素的最大异或值(字典树)
字典树
class TrieNode
{
public:
TrieNode* next[2];
int low;
TrieNode()
{
low=INT_MAX;
memset(next,0,sizeof(next));
}
};
class TrieTree
{
public:
TrieNode* proot;
TrieTree()
{
proot=new TrieNode();
}
void add(int num)
{
TrieNode* cur=proot;
for(int i=31;i>=0;i--)
{
int curbit=(num>>i)&1;
if(cur->next[curbit]==nullptr)
{
cur->next[curbit]=new TrieNode();
}
cur=cur->next[curbit];
cur->low=min(cur->low,num);
}
}
int find(int x,int m)
{
int sum=0;
TrieNode* cur=proot;
for(int i=31;i>=0;i--)
{
int xbit=(x>>i)&1;
if(xbit==1)
{
if(cur->next[0]!=nullptr)
{
sum+=(1<<i);
cur=cur->next[0];
}
else if(cur->next[1]!=nullptr && cur->next[1]->low <=m)
{
cur=cur->next[1];
}
else
{
return -1;
break;
}
}
else
{
if(cur->next[1]!=nullptr && cur->next[1]->low <=m)
{
sum+=(1<<i);
cur=cur->next[1];
}
else if(cur->next[0]!=nullptr)
{
cur=cur->next[0];
}
else
{
return -1;
break;
}
}
}
return sum;
}
};
class Solution {
public:
vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& queries) {
vector<int>res;
int minval=INT_MAX;
TrieTree* trie=new TrieTree();
for(int i=0;i<nums.size();i++)
{
trie->add(nums[i]);
minval=min(minval,nums[i]);
}
for(int i=0;i<queries.size();i++)
{
if(minval>queries[i][1])
{
res.push_back(-1);
}
else
{
res.push_back(trie->find(queries[i][0],queries[i][1]));
}
}
return res;
}
};