力扣
力扣
class Trie {
public:
vector<Trie*>child;
int val;
Trie(int v):child(vector<Trie*>{NULL, NULL}), val(v){}
void insert(int v) {
// if(v == 0) return;
Trie *cur = this;
for(int i = 31; i >=0; i--) {
int bit = (v>>i) & 1;
if(bit) {
if(!(cur->child[1])) {
cur->child[1] = new Trie(1);
}
cur = cur->child[1];
} else {
if(!(cur->child[0])) {
cur->child[0] = new Trie(0);
}
cur = cur->child[0];
}
}
}
int getMax(int v) {
Trie *cur = this;
int x = 0;
for(int i = 31; i >= 0; i--) {
int bit = (v>>i) & 1;
// if(!cur) break;
// cout << "v:" << v << " i:" << i << " bit:" << bit << " ret:" << x <<endl;
if(cur->child[!bit] == NULL) {
cur = cur->child[bit];
// if(bit)
// x = x*2 + 1;
// else
// x = x*2;
} else{
cur = cur->child[!bit];
x |= (1<<i);
// if(!bit)
// x = x*2 + 1;
// else
// x = x*2;
}
}
return x;
}
};
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
if(nums.size() < 1) return 0;
int ans = 0;
Trie*root = new Trie(0);
for(int i = 0; i < nums.size(); i++) {
root->insert(nums[i]);
}
for(int i = 0; i < nums.size(); i++) {
ans = max(ans, root->getMax(nums[i]));
}
return ans;
}
};
// 1100
// 1000
// 1010
// 0010
// 0111
// 2020