class Solution {
//前缀树节点的定义
static class TrieNode{
//由于这里的前缀树存储的不再是单词,而是一个数的32位二进制表示,所以节点只有两个子节点
TrieNode children[];
TrieNode(){
children = new TrieNode[2];
}
}
//使用int数组构建前缀树
public TrieNode buildTrie(int[] nums){
//创建根节点
TrieNode root = new TrieNode();
//遍历每一个数字,对于每一个数字创建一个正序的32位表示
for(int num : nums){
//对于每一个num从头到尾取它的二进制位构建节点
TrieNode node = root;
for(int i = 31;i >= 0;i-- ){
int bit = (num >> i) & 1;
if(node.children[bit] == null){
node.children[bit] = new TrieNode();
}
node = node.children[bit];
}
}
//返回根节点
return root;
}
public int findMaximumXOR(int[] nums) {
//构建前缀树
TrieNode root = buildTrie(nums);
int xor = 0;
int max = 0;
//遍历所有数到前缀树中做比较,使用打擂台的方式记录下来最大的值
for(int num : nums){
TrieNode node = root;
xor = 0;
for(int i = 31;i >= 0;i--){
int bit = (num >> i) & 1;
//优先选择进入二进制位不一致的
if(node.children[1 - bit] != null){
xor = (xor << 1) + 1;
node = node.children[1 - bit];
}else{
xor = xor << 1;
node = node.children[bit];
}
}
//每次遍历完成之后记录下最大的值
max = Math.max(xor,max);
}
//返回最大值
return max;
}
}
最大的异或java实现
最新推荐文章于 2022-08-16 21:29:51 发布