题目地址:
https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/
给定一个非负整数数组 A A A,返回其中两个两个数异或的最大可能值。
思路是用Trie。参考https://blog.csdn.net/qq_46105170/article/details/109763193。代码如下:
public class Solution {
class Node {
Node next[];
public Node() {
next = new Node[2];
}
}
Node root;
private void insert(int x) {
Node cur = root;
// 题目里x非负,所以用31位整数即可
for (int i = 31; i >= 0; i--) {
int idx = x >> i & 1;
if (cur.next[idx] == null) {
cur.next[idx] = new Node();
}
cur = cur.next[idx];
}
}
private int query(int x) {
int res = 0;
Node cur = root;
for (int i = 31; i >= 0; i--) {
int idx = x >> i & 1;
res <<= 1;
if (cur.next[idx ^ 1] != null) {
cur = cur.next[idx ^ 1];
res++;
} else {
cur = cur.next[idx];
}
}
return res;
}
public int findMaximumXOR(int[] nums) {
root = new Node();
int res = 0;
for (int num : nums) {
insert(num);
res = Math.max(res, query(num));
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。