1. 程式人生 > 其它 >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