题目描述
解题思路
总的来说就只需要两步
- 将数组中的数全部存入字典树中
- 遍历树中的每一个数在字典树中异或的最大结果,最后再求最大结果里面的最大值返回就是了
class Trie{
public:
// map<int, vector<int>> next;
Trie* next[2];
Trie()
{
memset(next, 0, sizeof(next));
}
};
class Solution {
Trie* root = new Trie();
public:
int findMaximumXOR(vector<int>& nums) {
// 将数全部存入字典树里面
for(int num : nums)
{
Trie* node = root;
for(int i = 30; i >= 0; i--)
{
int bt = num >> i & 1;
if(node->next[bt] == nullptr)
{
node->next[bt] = new Trie();
}
node = node->next[bt];
}
}
// 找最大^值
int res = 0;
for(int num : nums)
{
Trie* node = root;
int sum = 0;
for(int i = 30; i >= 0; i--)
{
int bt = num >> i & 1;
if(bt == 1)
{
sum += node->next[0] != nullptr ? 1 << i : 0 ;
node = node->next[0] != nullptr ? node->next[0] : node->next[1];
}
else
{
sum += node->next[1] != nullptr ? 1 << i : 0 ;
node = node->next[1] != nullptr ? node->next[1] : node->next[0];
}
}
res = max(res, sum);
}
return res;
}
};
时间复杂度:O(N)
空间复杂度:O(1)