

//然后再对每个数的异或值进行比较;
class Solution {
public:
struct Node
{
int son[2];
};
vector<Node>nodes;
int findMaximumXOR(vector<int>& nums) {
nodes.push_back({0,0});
for(auto x:nums)
{
int p=0;
for(int i=30;i>=0;i--)
{
int t=x>>i&1;
if(!nodes[p].son[t])//判断当前儿子存储的下一个节点是否存在
{
nodes.push_back({0,0});
nodes[p].son[t]=nodes.size()-1; //存储的是下一节点下标
}
p= nodes[p].son[t];
}
}
int res=0;
for(auto x:nums)
{
int p=0,max_xor=0;
for(int i=30;i>=0;i--)
{
int t=x>>i&1;
if(nodes[p].son[!t])//看当前节点的另一个儿子存不存在,存在就添加到答案
{
p=nodes[p].son[!t];
max_xor+=1<<i;
}
else
{
p=nodes[p].son[t];
}
}
res=max(res,max_xor);
}
return res;
}
};
本文深入探讨了一种用于寻找数组中两数异或最大值的高效算法。通过构建一个特殊的树状结构,该算法能在O(nlogn)的时间复杂度内完成任务。文章详细解释了如何遍历输入数组,利用位运算技巧进行节点更新,并在第二次遍历时计算最大异或值。此方法适用于信号处理、数据压缩等场景,展示了位操作和数据结构结合的魅力。
1042

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



