【leetcode】421. Maximum XOR of Two Numbers in an Array

题目如下:

解题思路:本题的难点在于O(n)的复杂度。为了减少比较的次数,我们可以采用字典树保存输入数组中所有元素的二进制的字符串。接下来就是找出每个元素的异或的最大值,把需要找最大值的元素转成二进制表达后逐位在字典树中查找,查找的时候优先匹配反码,反码不存在则用原码。

代码如下:

class Solution(object):
    def findMaximumXOR(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        MAX_LEN = 31
        root = {}
        for i in nums:
            node = root
            i = '0'*(MAX_LEN-len(bin(i)[2:])) + bin(i)[2:]
            for b in i:
                if b not in node:
                    node[b] = {}
                node = node[b]
        #print root['0']['0']['0']['1']['1']
        res = 0
        for i in nums:
            path = ''
            i = '0' * (MAX_LEN - len(bin(i)[2:])) + bin(i)[2:]
            node = root
            for b in i:
                if len(node) == 0:
                    break
                ib = '1' if b == '0' else '0'
                if ib in node:
                    node = node[ib]
                    path += ib
                else:
                    node = node[b]
                    path += b
            #print i,path,int(i,2),int(path,2)
            res = max(res,int(i,2)^int(path,2))
        return res

 

转载于:https://www.cnblogs.com/seyjs/p/9713475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值