1
+ // Runtime: 396 ms (Top 62.05%) | Memory: 87.3 MB (Top 27.92%)
1
2
class Solution {
2
3
public:
3
4
int findMaximumXOR (vector<int >& nums) {
4
5
int max_length = floor (log2 (max (*max_element (nums.begin (), nums.end ()), 1 ))) + 1 ;
5
6
int ans_int = 0 ;
6
7
string ans_string (' 0' , max_length);
7
8
TreeNode *root = new TreeNode (-1 );
8
-
9
+
9
10
for (auto &num : nums) {
10
11
TreeNode *curr_node = root;
11
12
TreeNode *comp_node = root;
12
13
string curr_num_to_bit = numToBit (num, max_length);
13
14
int update = 0 ;
14
15
char curr_bit = ' 0' ;
15
-
16
+
16
17
for (int curr = 0 ; curr < max_length; curr++) {
17
-
18
- if (curr_num_to_bit[curr] == ' 0' ) {
18
+
19
+ if (curr_num_to_bit[curr] == ' 0' ) {
19
20
if (curr_node -> left == nullptr ) curr_node -> left = new TreeNode (0 );
20
21
curr_node = curr_node -> left;
21
-
22
+
22
23
curr_bit = (comp_node -> right != nullptr ) ? ' 1' : ' 0' ;
23
24
comp_node = (comp_node -> right != nullptr ) ? comp_node -> right : comp_node -> left;
24
25
}
25
26
else {
26
27
if (curr_node -> right == nullptr ) curr_node -> right = new TreeNode (1 );
27
28
curr_node = curr_node -> right;
28
-
29
+
29
30
curr_bit = (comp_node -> left != nullptr ) ? ' 1' : ' 0' ;
30
- comp_node = (comp_node -> left != nullptr ) ? comp_node -> left : comp_node -> right;
31
+ comp_node = (comp_node -> left != nullptr ) ? comp_node -> left : comp_node -> right;
31
32
}
32
-
33
+
33
34
if (update == 0 && ans_string[curr] - ' 0' < curr_bit - ' 0' ) update = 1 ;
34
35
else if (update == 0 && ans_string[curr] - ' 0' > curr_bit - ' 0' ) update = -1 ;
35
-
36
+
36
37
ans_string[curr] = (update == 1 ) ? curr_bit : ans_string[curr];
37
38
}
38
39
}
39
40
40
41
for (int curr = 0 ; curr < max_length; curr++) {
41
42
ans_int += ((ans_string[curr] - ' 0' ) << (max_length - curr - 1 ));
42
43
}
43
-
44
+
44
45
return ans_int;
45
46
}
46
-
47
+
47
48
string numToBit (int num, int length) {
48
49
string num_to_bit = " " ;
49
-
50
+
50
51
while (num > 0 ) {
51
52
num_to_bit.push_back ((char )(num % 2 + ' 0' ));
52
53
num /= 2 ;
53
54
}
54
-
55
+
55
56
while (num_to_bit.size () < length) {
56
57
num_to_bit.push_back (' 0' );
57
58
}
58
-
59
+
59
60
reverse (num_to_bit.begin (), num_to_bit.end ());
60
-
61
+
61
62
return num_to_bit;
62
63
}
63
- };
64
+ };
0 commit comments