Skip to content

Commit a82a448

Browse files
committed
421
1 parent 1452fb5 commit a82a448

File tree

1 file changed

+19
-15
lines changed
  • leetcode/421. Maximum XOR of Two Numbers in an Array

1 file changed

+19
-15
lines changed

leetcode/421. Maximum XOR of Two Numbers in an Array/README.md

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,29 +61,33 @@ struct TrieNode {
6161
TrieNode *next[2] = {};
6262
};
6363
class Solution {
64-
void addNode(TrieNode *node, int n) {
64+
void add(TrieNode *node, int n) {
6565
for (int i = 31; i >= 0; --i) {
66-
int bit = (n >> i) & 1;
67-
if (!node->next[bit]) node->next[bit] = new TrieNode();
68-
node = node->next[bit];
66+
int b = n >> i & 1;
67+
if (node->next[b] == NULL) node->next[b] = new TrieNode();
68+
node = node->next[b];
6969
}
7070
}
71+
int maxXor(TrieNode *node, int n) {
72+
int ans = 0;
73+
for (int i = 31; i >= 0; --i) {
74+
int b = n >> i & 1;
75+
if (node->next[1 - b]) { // if we can go the opposite direction, do it.
76+
node = node->next[1 - b];
77+
ans |= 1 << i;
78+
} else {
79+
node = node->next[b];
80+
}
81+
}
82+
return ans;
83+
}
7184
public:
7285
int findMaximumXOR(vector<int>& A) {
7386
TrieNode root;
74-
for (int n : A) addNode(&root, n);
7587
int ans = 0;
7688
for (int n : A) {
77-
auto node = &root;
78-
int val = 0;
79-
for (int i = 31; i >= 0; --i) {
80-
int bit = (n >> i) & 1;
81-
if (node->next[1 ^ bit]) {
82-
val |= 1 << i;
83-
node = node->next[1 ^ bit];
84-
} else node = node->next[bit];
85-
}
86-
ans = max(ans, val);
89+
add(&root, n);
90+
ans = max(ans, maxXor(&root, n));
8791
}
8892
return ans;
8993
}

0 commit comments

Comments
 (0)