https://leetcode.com/problems/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:
Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28.
字典树:
class Solution {
public:
struct Node{
Node* zero;
Node* one;
Node():zero(NULL), one(NULL){};
};
Node* root = new Node();
int findMaximumXOR(vector<int>& nums) {
int result = 0;
if(nums.size() < 2) return result;
if(nums.size() == 2) return nums[0]^nums[1];
Node* cur_node;
add_num(nums[0]);
for(int i = 1; i < nums.size(); ++i){
int cur = nums[i];
int tem = compare_exist(cur);
// cout << tem << endl;
result = max(result, tem);
add_num(cur);
}
return result;
}
int compare_exist(int num){
Node* cur = root;
int result = 0;
for(int i = (1 << 30); i > 0; i >>= 1){
if(num & i){
if(cur->zero != NULL){
result |= i;
cur = cur->zero;
}else{
cur = cur->one;
}
}else{
if(cur->one != NULL){
result |= i;
cur = cur->one;
}else{
cur = cur->zero;
}
}
}
return result;
}
void add_num(int num){
Node* cur = root;
for(int i = (1 << 30); i > 0; i >>= 1){
if(num & i){
if(cur->one == NULL) cur->one = new Node();
cur = cur->one;
}else{
if(cur->zero == NULL) cur->zero = new Node();
cur = cur->zero;
}
}
}
};