[Leetcode421](python): 数组中两个数之间最大的异或值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode421](python): 数组中两个数之间最大的异或值相关的知识,希望对你有一定的参考价值。
参考技术A 给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n 。你能在O(n)的时间解决这个问题吗?示例:
根据 Trie Tree(字典树/前缀树/单词查找树) 对Trie基本结构的描述,编写构建结点,以及构建trie树,以及trie树的基本操作方法。
本题的解题思路:Trie树 + 位运算
对于25 (0000 0000 0000 0000 0000 0000 0001 1001) 而言,使得异或结果最大的数x为0000 0000 0000 0000 0000 0000 000* ****
从根节点开始搜索,node = root,直至到第5位,当前node为第6位右分支。
25第5位为1,则x的第5位为0,结果为最大,选择右分支,node = node.zero;
25第4位为1,则x的第4位为0,结果为最大,选择右分支,node = node.zero;
25第3位为0,则x的第3位为1,结果为最大,选择左分支,node = node.one;
25第2位为0,则x的第2位为1,结果为最大,当前node.one为空,所以选择node.zero, node = node.zero;
25第1位为1,则x的第1位为0,结果为最大,当前node.zero为空,所以选择node.one, node = node.one;最终找到x为5(00101)。
对于数组中每一个数进行上述操作,更新最大异或值。
建立Trie树的时间复杂度是O(32n),这里的32即Trie树的键值最大长度;Trie树的高度为32,因此查找每个数的最大异或值得时间复杂度是O(32n),合起来是O(64n)也即时间复杂度为O(n)
https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/discuss/130427/()-92
http://bookshadow.com/weblog/2016/10/15/leetcode-maximum-xor-of-two-numbers-in-an-array/
以上是关于[Leetcode421](python): 数组中两个数之间最大的异或值的主要内容,如果未能解决你的问题,请参考以下文章
leetcode-421-数组中两个数的最大异或值*(前缀树)
LeetCode 421. 数组中两个数的最大异或值 Java 前缀树