问:
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
原题链接:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/
例:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
答:
class Solution {
public int findMaximumXOR(int[] nums) {
Trie tr = new Trie();
int max = 0;
int len = nums.length;
for(int i = 0;i < len;i++)
{
tr.add(nums[i]);
max = Math.max(max,tr.find(nums[i]));
}
return max;
}
static class Trie
{
//前缀树的两个结点
Trie[] next;
public Trie()
{
this.next = new Trie[2];
}
public void add(int n)
{
Trie tr = this;
for(int i = 30;i >= 0;i--)
{
int index = n >> i & 1;
if(tr.next[index] == null)
{
tr.next[index] = new Trie();
}
tr = tr.next[index];
}
}
public int find(int n)
{
Trie tr = this;
int s = 0;
for(int i = 30;i >= 0;i--)
{
int index = n >> i & 1;
index ^= 1;
if(tr.next[index] != null)
{
s |= (1<<i);
}
else
{
index ^= 1;
}
tr = tr.next[index];
}
return s;
}
}
}