您的位置:首页 > 其它

421. Maximum XOR of Two Numbers in an Array

2017-05-28 15:13 323 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: