class Solution {
public int findMaximumXOR(int[] nums) {
//字典树+贪心
Trie trie = new Trie();
int res=0;
for(int i =1;i<nums.length;i++){
trie.insert(nums[i-1]);
res = Math.max(res,trie.helper(nums[i]));
}
return res;
}
}
class Trie{
// public int x;//记录异或后的结果
public boolean isEnd = false;//是否是末尾
public Trie[] child = new Trie[2];//子节点 0 1
//插入
public void insert(int x) {
Trie cur = this;
for (int i = 31; i >= 0; i--) {//一个32位
int bit = (x >> i) & 1;//只有0 1 两种结果
if (cur.child[bit] == null) {
cur.child[bit] = new Trie();
}
cur = cur.child[bit];
}
}
//求最大异或值
public int helper(int num) {
int ans = Integer.MIN_VALUE;
// for (int num : nums) {
int sum = 0;
Trie cur = this;
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;//只有0 1 两种结果
int xorBit = bit ^ 1;//获取相反结果
if (cur.child[xorBit] != null) {
//可以走这一步
sum = sum*2+1;
cur = cur.child[xorBit];
} else {
//不可以走,走剩下的
cur = cur.child[bit];
sum*=2;
}
}
ans = Math.max(ans, sum);
// }
return ans;
}
}
08-26
08-26