问题描述
简要思路
C++ 暴力解法很简单,但是会超时。
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
int maxxor = 0;
for(int i=0; i<nums.size(); i++){
for(int j=i; j<nums.size(); j++){
int temp = nums[i] ^ nums[j];
maxxor = max(maxxor,temp);
}
}
return maxxor;
}
};
但是暴力的 java 好像能通过。
这题在别的地方看过,使用字典树 Trie 就行,但是还没咋学,所以CV了。
代码
class Solution {
public:
struct Trie{
struct TrieNode
{
bool end;
TrieNode* child[2];
};
TrieNode * root;
Trie(){
root = new TrieNode();
}
void insert(int x)
{
TrieNode *p = root;
for(int i = 31; i >=0; --i)
{
int bit = (x >> i) & 1;
if(!p->child[bit])
p->child[bit] = new TrieNode();
p = p->child[bit];
}
p->end = true;
}
int search_max_XOR(int x)
{
TrieNode *p = root;
int ans = 0;
for(int i = 31; i >= 0; --i)
{
int bit = (x >> i) & 1;
if(p->child[bit^1])
{
p = p->child[bit^1];
ans = ans | (1 << i);
}
else
p = p->child[bit];
}
return ans;
}
};
int findMaximumXOR(vector<int>& nums) {
int n = nums.size();
if(n == 0 || n == 1) return 0;
Trie t;
t.insert(nums[0]);
int ans = INT_MIN;
for(int i = 1; i < n; ++i)
{
ans = max(ans, t.search_max_XOR(nums[i]));
t.insert(nums[i]);
}
return ans;
}
};