题目:
421. 数组中两个数的最大异或值
给你一个整数数组 nums
,返回 nums[i] XOR nums[j]
的最大运算结果,其中 0 ≤ i ≤ j < n
。
示例 1:
输入:nums = [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出:127
提示:
1 <= nums.length <= 2 * 105
0 <= nums[i] <= 231 - 1
解答:
代码:
class Solution {
public int findMaximumXOR(int[] nums) {
int max=0;
for(int x:nums){
max=Math.max(max,x);
}
int hightBit=31-Integer.numberOfLeadingZeros(max);
int ans=0,mask=0;
Set<Integer> seen=new HashSet<>();
for(int i=hightBit;i>=0;i--){//从最高位开始枚举
seen.clear();
mask |=1<<i;
int newAns=ans|(1<<i);//这个比特位可以是1吗
for(int x:nums){
x&=mask;//低于i的比特位置为0
if(seen.contains(newAns^x)){
ans=newAns;//这个比特位可以是1
break;
}
seen.add(x);
}
}
return ans;
}
}