您的位置:首页 > 其它

Maximum XOR of Two Numbers in an Array问题及解法

2017-09-03 00:41 381 查看
问题描述:

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;

9cdf
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: