思路:字典树 + 贪心
- 首先建立一棵字典树,高位的节点应该放在离根近的地方,所有的数字都挂在了树上
- 从根节点往下读,选择一个当前的数字
num,如果num最高位是1,那么就往0的方向去走。尽可能保证高位的结果是1,读完整棵树就可以了 - 需要注意的是,如何将一个32位的整数,将最左边标为0号,最右边标为31号(从左向右,从0到31标号),
(num >> (31 - i)) & 1
代码:
class TrieNode: def __init__(self): self.children = [None for i in range(2)] def insertNum(self, nums: List[int]) -> None: for num in nums: curNode = self for i in range(1, 32): curBit = ((num >> (31 - i)) & 1) if curNode.children[curBit] == None: curNode.children[curBit] = TrieNode() curNode = curNode.children[curBit]class Solution: # 所谓最大值,本质上就是希望两个数字各自能提供尽可能多的'1' # 先建一棵树,可以全挂上去(这一步应该有优化,但是我没有想到) def traverseTrie(self, node: TrieNode, num: int) -> None: maxRes = 0 for i in range(1, 32): curBit = (num >> (31 - i)) & 1 chooseDirection = curBit ^ 1 if node.children[chooseDirection] != None: node = node.children[chooseDirection] maxRes += (1 <<(31 - i)) else: node = node.children[curBit] return maxRes def findMaximumXOR(self, nums: List[int]) -> int: trieRoot = TrieNode() trieRoot.insertNum(nums) maxRes = 0 for num in nums: maxRes = max(maxRes, self.traverseTrie(trieRoot, num)) return maxRes