LeetCode刷题日记2021-5-16/421. 数组中两个数的最大异或值/二叉树

仅供自己学习记录

LeetCode刷题日记2021-5-16

题目描述

给你一个整数数组 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 * 10^4
  • 0 <= nums[i] <= 2^31 - 1

题解思路

使用双重循环的话 时间复杂度为n^2 会超时 所以我们采用前缀二叉树来完成

  • 从高位到低位构建一棵只有0和1的二叉树
  • 然后在二叉树中搜索

在这里插入图片描述
题解代码

class Tree():
	def __init__(self):
		self.left=None
		self.right=None
class Solution:
	def findMaximumXOR(self, nums: List[int]) -> int:
		root=Tree()
		high_bit=30
		
		def add(num):
			cur=root
			for k in range(high_bit,-1,-1):
				bit=(num>>k)&1
				if bit==1:
					if not cur.right:
						cur.right=Tree()
					cur=cur.right
				else:
					if not cur.left():
						cur.left=Tree()
					cur=cur.left
		def check(num):
			cur=root
			x=0
			for k in range(high_bit,-1,-1):
				bit=(num>>k)&1
				if bit==0:
					if cur.right:
						cur=cur.right
						x=x*x+1
					else:
						cur=cur.left
						x=x*2
				else:
					if cur.left:
						cur=cur.left
						x=x*2+1
					else:
						x=x*2
			return x
		
		n=len(nums)
		x=0
		for i in range(1,n):
			add(nums[i-1]
			x=max(x,check(x,nums[i])
		
		return x