一、题目
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。 进阶:你可以在 O(n) 的时间解决这个问题吗?二、题解思路
1.字典树(前缀树)
暴力求解会导致超时,这里使用字典树。
字典树:是一种树形数据结构,用于高效地存储和检索字符串数据集中的键
字典树题目:leetcode:208. 实现 Trie (前缀树)
本题目构造的字典树:节点为0(左)或1(右),
为什么叫字典树呢可能是因为对于树的每个子结点都有nums里唯一的num与之对应。
字典树的结构py3代码如下(示例):
class Trie:
def __init__(self,val):
self.val=val
self.child={}
2.将数插入
下面要实现将数插入字典树
首先要将十进制数的每一位从高到低取出,这里用了
>>运算符,range(lens,-1,-1)体现了i从大到小取
插入函数py3代码如下(示例):
def insert(root,num,lens):
curr=root
for i in range(lens,-1,-1):
v=(num>>i) & 1
if(v not in curr.child):
curr.child[v]=Trie(v)
curr=curr.child[v]
return root
3.搜索字典树
接下来要实现查找的功能,即给定一个数和一棵字典树
找到与该数异或后值最大的路径并输出该数
利用total*2的思想,每次*2后total都左移并在末尾补零
视情况+1
<font color=#999AAA >插入函数py3代码如下(示例):
def search(num,lens,roots:Trie):
curr=roots
total=0
for i in range(lens,-1,-1):
v=(num>>i) & 1
t=1-v
if(t in curr.child):
total=total*2+1
curr=curr.child[t]
else:
total=total*2
curr=curr.child[v]
return total
最后利用以上函数和数据结构,线性时间搜索nums列表
用变量max_储存每次迭代的最大值。
<font color=#999AAA >插入函数py3代码如下(示例):
4.线性时间求解
class Solution:
def findMaximumXOR(self, nums: List[int]) -> int:
root=Trie(-1)
lens=len(bin(max(nums))[2:])
for item in nums:
insert(root=root,num=item,lens=lens)
a=search(num=2,lens=lens,roots=root)
max_=0
for item in nums:
temp=search(num=item,lens=lens,roots=root)
if(temp>max_):
max_=temp
return max_
总结
这题没想出来,第一次见到这个数据结构,对python写树型结构也相对陌生,而且最后ac时间也只超过14%的人,以后有机会重新写一下。