其他分享
首页 > 其他分享> > leetcode-1707 与数组中元素的最大异或值

leetcode-1707 与数组中元素的最大异或值

作者:互联网

leetcode-1707 与数组中元素的最大异或值

解题思路

利用前缀树解决,方法同leetcode421,leetcode421是在整个前缀树中寻找异或值最大的那个值,本题是在小于m的前缀树中对应异或最大的值。
因为queries数组是无序的,如果采用暴力方法+前缀树,则每次查询需要重新构建一次前缀树
在421题的基础上,我们可以对nums数组和queries数组排序,这样可以保证每次寻找的数字比上次的数字大,对于前缀树而言,只需要往数中添加元素即可。对queries排序时,需要保存其原来的索引,在求解出结果后根据索引恢复结果。

代码

class TreeNode:
    def __init__(self,left=None,right=None):
        self.left=left
        self.right=right
class Solution:
    def maximizeXor(self, nums, queries):
        root=TreeNode()
        def add(n):
            cur=root
            x=0
            for k in range(30,-1,-1):
                bit=(n>>k)&1
                if bit==0:
                    if not cur.left:
                        cur.left=TreeNode()
                    cur=cur.left
                else:
                    if not cur.right:
                        cur.right=TreeNode()
                    cur=cur.right
        def check(num):
            cur=root
            if not cur.left and not cur.right:
                return -1
            x=0
            for i in range(30,-1,-1):
                bit=(num>>i)&1
                if bit==0:
                    if cur.right:
                        cur=cur.right
                        x=x*2+1
                    else:
                        cur=cur.left
                        x*=2
                else:
                    if cur.left:
                        cur=cur.left
                        x=x*2+1
                    else:
                        cur=cur.right
                        x*=2
            return x
        nums.sort()
        for i in range(len(queries)):
            queries[i].append(i)
        queries_sorted=sorted(queries,key=lambda x:x[1])
        length=len(nums)
        cur=0
        res_sorted=[]
        for item in queries_sorted:
            while cur<length and nums[cur]<=item[1]:
                add(nums[cur])
                cur+=1
            res_sorted.append(check(item[0]))
        res=[0]*len(res_sorted)
        for i in range(len(res_sorted)):
            res[queries_sorted[i][2]]=res_sorted[i]
        return res

标签:right,cur,1707,前缀,异或,queries,sorted,leetcode,left
来源: https://www.cnblogs.com/iven98/p/15413587.html