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)。

本文介绍了一种使用01字典树(Trie)解决最大异或对问题的方法。通过构建特殊的01字典树,并利用位运算实现高效的查询与插入操作,该方法能在O(nL)的时间复杂度内找到数组中两数的最大异或值,其中n为数组长度,L为二进制数的长度。
706

被折叠的 条评论
为什么被折叠?



