思路:从最高位向低位构造,对每一位利用哈希表寻找是否存在可使此位为1的数
第一轮找1:清空哈希表,1,2存1,到3发现1^0=1,res|=1<<3
第二轮找11:清空哈希表,1存10,2存10,3发现11^01=10,res|=1<<3
第三轮找111:清空哈希表,1存101,2存101,3存011…找不到能构造出111的
第四轮找1101:清空哈希表,1存1010,2存1011,到3发现1101^0111=1010,res|=(1<<0)
class Solution {
public:int findMaximumXOR(vector<int>& nums) {int res=0,mask=0;unordered_set<int>set;for(int i=31;i>=0;i--){set.clear();mask|=1<<i;int tmp=res|(1<<i);for(int num:nums){int x=num&mask;if(set.contains(tmp^x)){res=tmp;break;}set.insert(x);}}return res;}
};
在前边基础上加上限制条件即可,对任意强数对满足|x-y|<=min(x,y),假设x比y大那么2*y>=x即可,那么只需要排序后利用unordered_map记录之前的值比较一下即可
class Solution {
public:int maximumStrongPairXor(vector<int>& nums) {sort(nums.begin(),nums.end());int res=0,mask=0;unordered_map<int,int>map;for(int i=31;i>=0;i--){map.clear();mask|=1<<i;int tmp=res|(1<<i);for(int j:nums){int x=mask&j;if(map.count(tmp^x)&&map[tmp^x]*2>=j){res=tmp;break;}map[x]=j;}}return res;}
};