字典树的学习
LeetCode 421. 数组中两个数的最大异或值
思路:用字典树保存每个整数的二进制串,然后使每个数都和字典树异或,获取该数和数组其他数异或的最大值。最后返回所有数最大值中的最大的那个。
class Trie{
public:
Trie(Trie* left=nullptr, Trie* right=nullptr):left(left), right(right){};
Trie* left; // left 代表1
Trie* right; // right 代表 0
};
class Solution {
public:
Trie* tr;
void add(int num)
{ // 创建 num 的字典
int i = 30;
Trie* t = tr;
int tmp;
for(;i>=0; --i) {
tmp = (num >> i)&1;
if(tmp) {
if(!t->left) // 若该节点无,创建
t->left = new Trie();
t = t->left;
}
else {
if(!t->right)
t->right = new Trie();
t = t->right;
}
}
}
int find(int num)
{
int maxNum = 0;
int i = 30; // 数据范围为0 - 2^31 -1 所以字典树高度设置为30+1 + 1;
int tmp;
Trie* t = tr;
for(; i>=0; --i) {
tmp = (num>>i) & 1;
if((tmp && t->right) || (!tmp && t->left)) {
maxNum = (maxNum * 2) + 1;
t = (tmp ? t->right:t->left);
}
else {
maxNum = maxNum*2;
t = (tmp? t->left : t->right);
}
}
return maxNum;
}
int findMaximumXOR(vector<int>& nums) {
int ans = 0;
int tmpMax;
tr = new Trie();
for(int num: nums) {
add(num);
tmpMax = find(num);
ans = (ans > tmpMax ? ans : tmpMax);
}
return ans;
}
};