File tree Expand file tree Collapse file tree 1 file changed +19
-15
lines changed
leetcode/421. Maximum XOR of Two Numbers in an Array Expand file tree Collapse file tree 1 file changed +19
-15
lines changed Original file line number Diff line number Diff line change @@ -61,29 +61,33 @@ struct TrieNode {
61
61
TrieNode * next[ 2] = {};
62
62
};
63
63
class Solution {
64
- void addNode (TrieNode * node, int n) {
64
+ void add (TrieNode * node, int n) {
65
65
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 ] ;
69
69
}
70
70
}
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
+ }
71
84
public:
72
85
int findMaximumXOR(vector<int >& A) {
73
86
TrieNode root;
74
- for (int n : A) addNode(&root, n);
75
87
int ans = 0;
76
88
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));
87
91
}
88
92
return ans;
89
93
}
You can’t perform that action at this time.
0 commit comments