问题描述:
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231.
Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.
Could you do this in O(n) runtime?
示例:
Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28.
问题分析:
本题关键在于求得两个数之间从高位到低位首个不相同的的二进制位,我们可以使用Trie树数据结构,先将所有的数以二进制形式由高到低存放起来,从而方便我们下一步遍历。在计算异或值时,只添加两者异或为1的即可,有点贪心的意思。
过程详见代码:
class Trie{
public:
Trie* children[2];
public:
Trie()
{
children[0] = nullptr;
children[1] = nullptr;
}
};
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
if (nums.empty()) return 0;
Trie *root = new Trie();
for (auto num : nums)
{
Trie * curNode = root;
for (int i = 31; i >= 0; i--)
{
int curBit = (num >> i) & 1;
if (curNode->children[curBit] == nullptr)
curNode->children[curBit] = new Trie();
curNode = curNode->children[curBit];
}
}
int maxi = INT_MIN;
for (auto num : nums)
{
Trie* curNode = root;
int curSum = 0;
for (int i = 31; i >= 0; i--)
{
int curBit = (num >> i) & 1;
if (curNode->children[curBit ^ 1] != nullptr)
{
curSum += (1 << i);
curNode = curNode->children[curBit ^ 1];
}
else curNode = curNode->children[curBit];
}
maxi = max(maxi, curSum);
}
return maxi;
}
};