字典树(Trie,也叫前缀树)
Trie这个词来自retrieval
提交的答案中有一个精妙的设计如下图:
既能让所有可能的结果充分比较,又能只有一层循环。当然,前提是使用字典树(前缀树),像这种涉及前缀的题目,最简单的O(n2)的方法一般都会超时,字典树可以让时间复杂度变为O(nlogC),前提是使用上图的比较方式,确保只用一层循环。
提交的答案
class Solution {
Trie root = new Trie();
public int findMaximumXOR(int[] nums) {
int ans = 0;
for(int i=1; i<nums.length; i++){
add(nums[i-1]);
ans = Math.max(ans, check(nums[i]));
}
return ans;
}
void add(int num){
Trie cur = root;
for(int k = 30; k>=0; k--){
int bit = (num>>k) & 1;
if(bit == 0){
if(cur.left == null){
cur.left = new Trie();
}
cur = cur.left;
}
else{
if(cur.right == null){
cur.right = new Trie();
}
cur = cur.right;
}
}
}
int check(int num){
Trie cur = root;
int ret = 0;
for(int k = 30; k>=0; k--){
int bit = (num>>k) & 1;
if(bit == 0){
if(cur.right != null){
cur = cur.right;
ret = ret*2+1;
}
else{
cur = cur.left;
ret = ret*2;
}
}
else{
if(cur.left != null){
cur = cur.left;
ret = ret*2+1;
}
else{
cur = cur.right;
ret = ret*2;
}
}
}
return ret;
}
class Trie{
Trie left;
Trie right;
}
}