5.16 leetcode每日一题:421. 数组中两个数的最大异或值

一、题目

给你一个整数数组 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%的人,以后有机会重新写一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值