Maximum XOR of Two Numbers in an Array

1.题目描述(难度Medium)

Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231.

Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.

Could you do this in O(n) runtime?

Example:

Input: [3, 10, 5, 25, 2, 8]

Output: 28

Explanation: The maximum result is 5 ^ 25 = 28.

2.题目分析

题目要求的是在一个数组中,求这个数组中两两与或结果最大的数。
解题思路:

  1. 很容易想到的一个就是把数组中所有两两数字进行XOR运算,返回最大的结果即可。这个时间复杂度为,题目要求
  2. 这是一个比较tricky的思路,我们从最高位开始设置Mask,eg:假设我们最大值是5位的,那么mask的取值为0b10000,0b11000,...,0b11111。每次我们都把mask与数组中的元素进行&操作,这样,我们每次得到的结果就是关于数组中前几位的值,同时,我们假设当前的最大值为max_possible=max_value|当前位的掩码。我们再进行异或操作,对结果数组中进行xor操作,如果结果依旧在数组中,那么我们就认为当前值是当前位的max_value.然后进行下一轮判断,直到mask的取值为全1(即我们试探完所有的位数).
    基本是从最高位开始,每次试探性的添加下一位为1的数,因为XOR的最大值肯定是在最高位有值的数和另一个数产生的。所以,从前往后筛选比较靠谱。

基础知识:a xor b=c,a xor c=b

3.解题过程

Begin(算法开始)
输入 数组nums
计算最大的长度max_len = len(bin(max(nums)))-2
当然,这一步我们可以不做,直接使用给定数值最大位数,比如说32位,64位。
初始化max_value = 0, mask=0
for i in range(max_len-1,-1,-1): 范围为[max_len-1,0]
计算当前叠加的mask |= 1<<i
计算当前可能的max值,max_possible = max_value|1<<i
计算mask&nums把结果放入set 设为,bitsets
对于每个在bitsets中的bit,我们进行max_possbileXORbit操作,如果结果在bitsets中,那么当前的max_possible即为我们所要求的max_value,跳出当前操作,继续进行主循环。
return max_value
End (算法结束)

具体代码(python)已对应实现,但是测试用例代码还没完善,如上述思路有不足之处请批评指正。

猜你喜欢

转载自blog.csdn.net/weixin_34129145/article/details/87454845