classSolution{classTrieNode{TrieNode[] children;TrieNode(){
children =newTrieNode[2];}}privateTrieNode root;int max;voidbuildTree(int[] nums){
root =newTrieNode();for(int num : nums){TrieNode cur = root;for(int i =31; i >=0; i--){int bit = num >> i &1;if(null== cur.children[bit])
cur.children[bit]=newTrieNode();
cur = cur.children[bit];}}}publicintfindMaximumXOR(int[] nums){buildTree(nums);for(int num : nums){int xor =0;TrieNode cur = root;for(int i =31; i >=0; i--){
xor <<=1;int bit = num >> i &1;if(null!= cur.children[1- bit]){
xor +=1;
cur = cur.children[1- bit];}else
cur = cur.children[bit];}
max =Math.max(xor,max);}return max;}}
题目链接思路这道题暴力法就是两两异或,时间复杂度是O(n²),但是可以用前缀和来优化~对于一个数X,如果有两个整数m n ,m和n相比,某高位和x的异或结果是1,那么肯定m^x > n^x,基于此我们可以得知想要异或结果大,最好是高位异或结果是1所以我们可以建立前缀树,只不过这个时候不是以小写英文字母作为结点,而是以0和1,建立的基础是整数的二进制位数,并且高位先建立,因为我们优先选择高位不同的所以我们首先利用nums数组建立前缀树,这个过程是O(n)然后再次遍历nums数组,每个num