leetcode-1707 與陣列中元素的最大異或值
阿新 • • 發佈:2021-10-16
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