[leetcode]421. Maximum XOR of Two Numbers in an Array
2016-10-20 16:08
537 查看
421. Maximum XOR
of Two Numbers in an Array
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?
Example:
思路一:
利用a ^ b = c,而a ^ b ^ b = a, 则 c ^ b = a.
思路二:
Tire树,利用nums中的数构建tire树,然后依次查找数组nums中数的异或最大值
struct Node{
Node * next[2];
Node()
{
next[0] = nullptr;
next[1] = nullptr;
}
};
void buildTireTree(Node* root, int x)
{
for( int i = 31; i >= 0; --i )
{
int flag = ( x & (1<<i) ) ? 1 : 0;
if( root->next[flag] == nullptr )
{
root->next[flag] = new Node();
}
root = root->next[flag];
}
}
int findMaxXorInTire(Node* root, int x)
{
int result = 0;
for( int i = 31; i >= 0; --i )
{
int flag = ( x & ( 1<<i) )? 0: 1;
if( root->next[flag] != nullptr )
{
result |= (1<<i);
root = root->next[flag];
}
else
root = root->next[1-flag];
}
return result;
}
public:
int findMaximumXOR(vector<int>& nums) {
if( nums.size() < 2 ) return 0;
Node head;
for( int x: nums )
{
buildTireTree( &head, x );
}
int maxNum = 0;//INT_MIN;
for( int x: nums )
{
int m = findMaxXorInTire( &head, x );
maxNum = max( maxNum, m );
}
return maxNum;
}
of Two Numbers in an Array
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?
Example:
Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28.
思路一:
利用a ^ b = c,而a ^ b ^ b = a, 则 c ^ b = a.
int findMaximumXOR(vector<int>& nums) { if( nums.size() < 2 ) return 0; int maxNum = 0; int flag = 0; for( int i = 31; i >= 0; --i ) {//<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">从最大值maxNum最高位到最低位开始确定</span> set<int> hash; flag |= (1<<i); for( int x: nums ) { hash.insert( flag & x ); } int tmp = maxNum | ( 1<<i ); for( int x: hash ) { if( hash.find( x ^ tmp ) != hash.end() ) { maxNum = tmp; break; } } } return maxNum; }
思路二:
Tire树,利用nums中的数构建tire树,然后依次查找数组nums中数的异或最大值
struct Node{
Node * next[2];
Node()
{
next[0] = nullptr;
next[1] = nullptr;
}
};
void buildTireTree(Node* root, int x)
{
for( int i = 31; i >= 0; --i )
{
int flag = ( x & (1<<i) ) ? 1 : 0;
if( root->next[flag] == nullptr )
{
root->next[flag] = new Node();
}
root = root->next[flag];
}
}
int findMaxXorInTire(Node* root, int x)
{
int result = 0;
for( int i = 31; i >= 0; --i )
{
int flag = ( x & ( 1<<i) )? 0: 1;
if( root->next[flag] != nullptr )
{
result |= (1<<i);
root = root->next[flag];
}
else
root = root->next[1-flag];
}
return result;
}
public:
int findMaximumXOR(vector<int>& nums) {
if( nums.size() < 2 ) return 0;
Node head;
for( int x: nums )
{
buildTireTree( &head, x );
}
int maxNum = 0;//INT_MIN;
for( int x: nums )
{
int m = findMaxXorInTire( &head, x );
maxNum = max( maxNum, m );
}
return maxNum;
}
相关文章推荐
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
- leetcode 421. Maximum XOR of Two Numbers in an Array
- [LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)
- leetcode 421. 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 解题报告
- Leetcode: Maximum XOR of Two Numbers in an Array
- 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
- 【LeetCode-421】Maximum XOR of Two Numbers in an Array
- trie树-leetcode-421. Maximum XOR of Two Numbers in an Array
- [leetcode]421. Maximum XOR of Two Numbers in an Array
- 【LeetCode】 421. Maximum XOR of Two Numbers in an Array
- [LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)
- 【LeetCode】421. Maximum XOR of Two Numbers in an Array 解题报告(Python)
- leetcode 421. Maximum XOR of Two Numbers in an Array 最大的异或运算值 + 位运算
- LeetCode: 421. Maximum XOR of Two Numbers in an Array
- LeetCode 421. Maximum XOR of Two Numbers in an Array 位运算求解