题目链接
题目描述
给你一个整数数组
n
u
m
s
nums
nums,返回
n
u
m
s
[
i
]
nums[i]
nums[i]
X
O
R
XOR
XOR
n
u
m
s
[
j
]
nums[j]
nums[j] 的最大运算结果,其中
0
≤
i
≤
j
<
n
0 \leq i \leq j < n
0≤i≤j<n 。
示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
提示:
1
≤
n
u
m
s
.
l
e
n
g
t
h
≤
2
∗
1
0
4
1 \leq nums.length \leq 2 * 10^4
1≤nums.length≤2∗104
0
≤
n
u
m
s
[
i
]
≤
231
−
1
0 \leq nums[i] \leq 231 - 1
0≤nums[i]≤231−1
T
r
i
e
Trie
Trie树
在 1~
x
x
x 中找个数
n
u
m
num
num 与
x
x
x 异或值最大。
class Solution {
public:
vector<vector<int>> son;
void add(int x)
{
int p = 0;
for(int i = 30; i >= 0; --i)
{
int u = x >> i & 1;
if(!son[p][u])
{
son[p][u] = son.size();
son.push_back({0, 0});
}
p = son[p][u];
}
}
int query(int x)
{
int p = 0, res = 0;
for(int i = 30; i >= 0; --i)
{
int u = x >> i & 1;
if(son[p][!u])
{
p = son[p][!u];
res = (res << 1) + !u;
}
else
{
p = son[p][u];
res = (res << 1) + u;
}
}
return res^x;
}
int findMaximumXOR(vector<int>& nums) {
son.push_back({0, 0});
int res = 0;
for(auto x : nums){
res = max(res, query(x));
add(x);
}
return res;
}
};