题目:
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [0]
输出:0
示例 3:
输入:nums = [2,4]
输出:6
示例 4:
输入:nums = [8,10,2]
输出:10
示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 231 - 1
答案:
class Solution {
// 字典树的根节点
TrieNode root = new TrieNode();
public class TrieNode {
// 左子树指向表示 0 的子节点
TrieNode left = null;
// 右子树指向表示 1 的子节点
TrieNode right = null;
}
public int findMaximumXOR(int[] nums) {
int n = nums.length;
int max = 0;
for(int i = 1; i < n; i++){
add(nums[i - 1]);
max = Math.max(max, check(nums[i]));
}
return max;
}
public void add(int num){
TrieNode node = root;
for(int i = 30; i >= 0; i--){
if(((num >> i) & 1) == 0){
if(node.left == null){
node.left = new TrieNode();
}
node = node.left;
}else if(((num >> i) & 1) == 1){
if(node.right == null){
node.right = new TrieNode();
}
node = node.right;
}
}
}
public int check(int num){
TrieNode node = root;
int ans = 0;
for(int i = 30; i >= 0; i--){
if(((num >> i) & 1) == 0){
if(node.right != null){
node = node.right;
ans = ans * 2 + 1;
}else{
node = node.left;
ans = ans * 2;
}
}else if(((num >> i) & 1) == 1){
if(node.left != null){
node = node.left;
ans = ans * 2 + 1;
}else{
node = node.right;
ans = ans * 2;
}
}
}
return ans;
}
}