给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。进阶:你可以在 O(n) 的时间解决这个问题吗?
示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [0]
输出:0
示例 3:
输入:nums = [2,4]
输出:6
示例 4:
输入:nums = [8,10,2]
输出:10
示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 231 - 1
代码一(暴力法超时):
class Solution(object):
def findMaximumXOR(self, nums):
xorlist = []
n = len(nums)
if n==1:
return 0
else:
for i in range(n-1):
for j in range(i+1,n):
xorlist.append(nums[i]^nums[j])
return max(xorlist)
要想在o(n)时间内完成,需要考虑如何在o(n)时间内找到所有的异或值,官方代码如下:
class Solution(object):
def findMaximumXOR(self, nums):
#贪心+字典Tree
root = TreeNode(-1)
for num in nums:
cur_node = root #当前的node
for i in range(0, 32): #代表32个位
# print num, 1 <<(31 - i), num & (1 <<(31 - i))
if num & (1 <<(31 - i)) == 0: #如果当前位与运算的结果是1, 就往左走
if not cur_node.left:
cur_node.left = TreeNode(0)
cur_node = cur_node.left
else: #如果当前位与运算的结果是0, 就往右走
if not cur_node.right:
cur_node.right = TreeNode(1)
cur_node = cur_node.right
cur_node.left = TreeNode(num) #在最后的左叶子节点记录一下这个数的值
res = 0
for num in nums:
cur_node = root
for i in range(0, 32):
# print cur_node.val, cur_node.left, cur_node.right
if num & (1 <<(31 - i)) == 0: #与运算结果为0,如果能往右走,就往右走,因为右子树代表1,这样在这一位上异或会得到1
if cur_node.right: #能往右走
cur_node = cur_node.right#就往右走
else: #不能往右走
cur_node = cur_node.left#就往左走
else: #与运算结果为1,如果能往左走,就往左走,因为左子树代表0,这样异或会得到1
if cur_node.left: #能往左走
cur_node = cur_node.left#就往左走
else: #不能往左走
cur_node = cur_node.right#就往右走
temp = cur_node.left.val #得到这条路径存放的数的值
res = max(res, num ^ temp) #每次刷新res为最大值
return res