标题文字
链接:https://leetcode.com/problems...
可以用trie tree来做。把所有num放进tree,之后对每一个num从最高位找是否存在和当前bit不同的path。把build tree单独写一个函数,结果TLE了,所以放一起了。。
public class Solution {
public int findMaximumXOR(int[] nums) {
/* trie tree: root is the largest bit
* 32 bits
*/
TrieNode root = new TrieNode();
for(int num : nums) {
TrieNode node = root;
for(int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
if(node.children[bit] == null) node.children[bit] = new TrieNode();
node = node.children[bit];
}
}
int globalMax = Integer.MIN_VALUE;
for(int num : nums) {
int local = 0;
TrieNode node = root;
for(int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
if(node.children[bit ^ 1] != null) {
local += (1 << i);
node = node.children[bit ^ 1];
}
else node = node.children[bit];
}
globalMax = Math.max(globalMax, local);
}
return globalMax;
}
class TrieNode {
TrieNode[] children = new TrieNode[2];
}
}
看到discussion还有一种简单的方法,从最高位开始扫,每次在nums里面找有没有两个数XOR可以等于1。如果有就把1放进去,当前结果累计到下一个循环。用一个set存到第i位位置的数,然后通过XOR就能找到有没有可以匹配的数。
把所有num(31, i)放进set里面
找出set中是否有两个数XOR后等于i = 1的结果
有就更新globalMax
第二步根据 x ^ y = z, then x ^ z = y
public class Solution {
public int findMaximumXOR(int[] nums) {
int globalMax = 0, highestBits = 0;
for(int i = 31; i >= 0; i--) {
// 1000 -> 1100 -> 1110 -> 1111
highestBits = highestBits | (1 << i);
Set<Integer> set = new HashSet();
for(int num : nums) {
set.add(num & highestBits);
}
// find if current bit can be 1
int addOne = globalMax | (1 << i);
for(int num : set) {
if(set.contains(num ^ addOne)) {
globalMax = addOne;
break;
}
}
}
return globalMax;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。