原题链接:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/?envType=daily-question&envId=2023-11-04
题目分析
异或且时间复杂度在nlogn内第一反应想到字典树,扫一遍存进字典树,然后遍历每个数,
对比当前位数i下,整个数组内是否有某个数的i位上和当前数的i位相异的,如果相异就能取1。高位优先,所以查出来的数会是最大的。
细节上没处理好,过了题但效率偏低
C++代码(字典树)
class Solution {
public:
int idx = 0;
int son[32*200000+5][2];
void insert(string str){
int p = 0;//指向树中哪一个节点
for(int i=0;i<str.length();i++){
int u = str[i]-'0';
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
}
int to_decimal(string str){
int res = 0;
for(int i=0;i<=31;i++){
if(str[i]-'0') res += pow(2,31-i);
}
return res;
}
int findMaximumXOR(vector<int>& nums) {
int res = 0;
memset(son,0,sizeof son);
for(auto it:nums){
bitset<32> binary(it);
insert(binary.to_string());
}
for(auto it:nums){
bitset<32>binary(it);
string str = binary.to_string();
string temp = "";
int len = str.length();
int p = 0;
for(int i=0;i<len;i++){
int x = str[i]-'0';
if(!son[p][!x]){//相异不行,只能取相同
p = son[p][x];
temp += "0";
}else{
p = son[p][!x];
temp += "1";
}
}
res = max(res,to_decimal(temp));
}
return res;
}
};
时间复杂度:O(nlogC) C为数值大小
空间复杂度:O(nlogC)
实际运行出来效率不高,占的空间也比较大