421. 数组中两个数的最大异或值
给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。
找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n 。
你能在O(n)的时间解决这个问题吗?
示例:
输入: [3, 10, 5, 25, 2, 8]
输出: 28
解释: 最大的结果是 5 ^ 25 = 28.
这道题挺难得,用到了贪心算法+哈希存储+异或运算+前缀运算
每次都假设最高位存在,然后遍历异或,如果最高位真的存在,遍历下一位,反复进行,
class Solution {
public int findMaximumXOR(int[] nums) {
int res=0,mask=0;
for(int i=30;i>=0;i--){
mask|=(1<<i);
Set<Integer>set=new HashSet<>();
for(int a:nums){
set.add(a&mask);
}
int temp=res|(1<<i);
for(Integer a:set){
if(set.contains(a^temp)){
res=temp;
break;
}
}
}
return res;
}
}