题目:
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
代码:
class Solution {
public int findMaximumXOR(int[] nums) {
int res = 0;
for (int i = 1; i < nums.length; i++) {
add(nums[i - 1]);
res = Math.max(res, search(nums[i]));
}
return res;
}
class TreeNode {
TreeNode[] next = new TreeNode[2];
}
TreeNode root = new TreeNode();
public void add(int num) {
TreeNode cur = root;
for (int i = 30; i >= 0; i--) {
int index = (num >> i) & 1;
if (cur.next[index] == null) {
cur.next[index] = new TreeNode();
}
cur = cur.next[index];
}
}
public int search(int num) {
TreeNode cur = root;
int max = 0;
for (int i = 30; i >= 0; i--) {
int index = (num >> i) & 1;
max = max << 1;
if (cur.next[index ^ 1] == null) {
cur = cur.next[index];
} else {
cur = cur.next[index ^ 1];
max ++;
}
}
return max;
}
}
解题思路:
这道题乍一看很难,其实只有两个地方可能会比较刁钻一点。
一个是如何把数字按二进制存储到前缀树中,另一个是异或操作的时候应该在前缀树上怎么走。
存储的时候直接 for (int i = 30; i >= 0; i--) {
int index = (num >> i) & 1;
就可以啦。
异或的时候,如果当前是 1 ,就尽量让他去找 0 ,如果当前是 0 ,就尽量让他去找 1 ,这样才可以最大化。我们注意到 1 异或 1 为 0 , 0 异或 1 为 1,所以在前缀树上寻找路径逻辑的代码也就写出来啦。然后再用一个值来记录最大值就行啦。最后遍历数组,进行比较。
注意:
少吃零食多看报。
参考链接:
力扣