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?
示例:
问题分析:
本题关键在于求得两个数之间从高位到低位首个不相同的的二进制位,我们可以使用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;
}
};
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;
}
};
相关文章推荐
- 【LeetCode-421】Maximum XOR of Two Numbers in an Array
- LeetCode Maximum XOR of Two Numbers in an Array
- LeetCode 421 Maximum XOR of Two Numbers in an Array 解题报告
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
- LeetCode #421: Maximum XOR of Two Numbers in an Array
- Maximum XOR of Two Numbers in an Array
- Leetcode Maximum XOR of Two Numbers in an Array
- 【特别好】【位运算】maximum-xor-of-two-numbers-in-an-array
- Trie (3) -- Maximum XOR of Two Numbers in an Array
- Maximum XOR of Two Numbers in an Array--异或、字典树
- 前缀树及应用两数异或Leetcode之 Maximum XOR of Two Numbers in an Array
- Maximum XOR of Two Numbers in an Array
- Leetcode: Maximum XOR of Two Numbers in an Array
- Finding sum of every combination of two numbers in an array in Ruby
- Leetcode 421. Maximum XOR of Two Numbers in an Array 最大Xor和 解题报告【待理解】
- leetcode 421. Maximum XOR of Two Numbers in an Array
- [LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)
- 421. Maximum XOR of Two Numbers in an Array
- [LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)
- Find the two non-repeating elements in an array of repeating elements