考察点:trie树,还有一种set方法,思路类似;
思路:首先建立trie字典树,它记录了这些nums中从最高位第32位(脚码是31)开始建立二叉树,只有0,1,建立的时候是对每一个数字,按照从高位到低位的顺序遍历各个位; 然后就是寻找XOR的最大数值了,它是由这颗树root跟nums中的每一个num产生的,对于每一个num,依次将它的每一个位与trie树中的节点比较,若能异或为1,就将ret的该位置为1,否则置为0;
C++代码:
class Solution {
public:
struct TrieNode {
TrieNode *child[2];
TrieNode() {
child[0] = NULL;
child[1] = NULL;
}
};
TrieNode *buildTree(vector<int> &nums) {
TrieNode *root = new TrieNode();
TrieNode *cur = NULL;
int n = nums.size();
for (int i=0; i<n; i++) {
cur = root;
for (int j = 31; j>=0; j--) {
int index = ((nums[i]>>j)&1);
if (cur->child[index] == NULL)
cur->child[index] = new TrieNode();
cur = cur->child[index];
}
}
return root;
}
int help(TrieNode * node, int num) {
int ret = 0;
for (int i=31; i>=0; i--) {
int index = ((num>>i)&1) ? 0 : 1;
if (node->child[index]) {
ret <<= 1;
ret |= 1;
node = node->child[index];
} else {
ret <<= 1;
node = node->child[index ? 0 : 1];
}
}
return ret;
}
int findMaximumXOR(vector<int>& nums) {
int ret = 0;
TrieNode *root = buildTree(nums);
for (int i=0; i<nums.size(); i++) {
ret = max(ret, help(root, nums[i]));
}
return ret;
}
};