Trie的经典应用,01字典树求最大异或对。
class Solution {
public:
static const int N=2e5+10;
int ch[N*31][2];
int idx;
void insert(int x){
int p=0;
for(int i=30;~i;i--){
int j=(x>>i)&1;
if(!ch[p][j]) ch[p][j]=++idx;
p=ch[p][j];
}
}
int query(int x){
int p=0,res=0;
for(int i=30;~i;i--){
int j=(x>>i)&1;
if(ch[p][!j]){
res|=(1<<i);
p=ch[p][!j];
}
else p=ch[p][j];
}
return res;
}
int findMaximumXOR(vector<int>& nums) {
memset(ch,0,sizeof ch);
int ans=0;
for(auto c:nums){
insert(c);
ans=max(ans,query(c));
}
return ans;
}
};
时间复杂度:O(nL),n为数组的长度,L为二进制数的长度。
空间复杂度:O(nL)。