Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231.
Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.
Could you do this in O(n) runtime?
Example:
Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28.这道题用单词搜索树思路比较清晰,存的是当前位的值,0和1。查找的时候,找能不能找到跟当前位异或出1的位,如果可以,temp加上那一位,最后判断跟max的大小。如果不加限制条件,会出现TEL的情况。代码如下:
public class Solution {
class Trie {
Trie[] child;
public Trie() {
child = new Trie[2];
}
}
public int findMaximumXOR(int[] nums) {
Trie root = new Trie();
for (int num: nums) {
Trie currTrie = root;
for (int i = 31; i >= 0; i --) {
int currBit = (num >>> i) & 1;
if (currTrie.child[currBit] == null) {
currTrie.child[currBit] = new Trie();
}
currTrie = currTrie.child[currBit];
}
}
int max = 0;
for (int num: nums) {
Trie currTrie = root;
int temp = 0;
for (int i = 31; i >= 0; i --) {
int currBit = (num >>> i) & 1;
if (currTrie.child[currBit ^ 1] != null) {
currTrie = currTrie.child[currBit ^ 1];
temp += (1 << i);
} else {
currTrie = currTrie.child[currBit];
}
// for this case: even if all left bits results are 1s, curSum still cannot catch up max value
if (temp < max && max - temp >= (1 << i) - 1) {
break;
}
}
max = Math.max(max, temp);
}
return max;
}
}