ððð 421. æ°ç»äžäž€äžªæ°çæ倧åŒæåŒ
2022幎10æ10æ¥
- algorithm
ððð 421. æ°ç»äžäž€äžªæ°çæ倧åŒæåŒ
éŸåºŠ: ððð
é®é¢æè¿°
解æ³
class Solution {
public int findMaximumXOR(int[] nums) {
// æè·¯ïŒ
// æé åå
žæ ïŒåªæå·Šå³äž€äžªèç¹ïŒåå«è¡šç€º 0 & 1
// 1. éåå
çŽ ïŒåå§ååå
žæ
// 2. å®äœå°éŠèç¹ïŒè¯¥èç¹å€ cur.left != null && cur.right != null æ£å¥œåºç° 0 & 1
// 3. éåœæŸå°æ倧è¿ç®ç»æ
Node root = new Node(0);
// 1. å€æ床 O(30 * N)
for(int i: nums) {
// 2^31 - 1 æé«äœç 1 æåšäœçœ®äžº 1 <<< 30
int monitor = (1 << 30); // åå§åç
§åŒäžä¹åŒæå€æ该äœæ¯åŠäžº 1
Node tmp = root;
while(monitor > 0) {
// æ ¹æ®æ¯äœçåŒè¿è¡å·Šå³èç¹çæå
¥
int cur = (monitor & i);
if(cur == 0) {
if(tmp.left == null) {
tmp.left = new Node(0);
}
tmp = tmp.left;
} else {
if(tmp.right == null) {
tmp.right = new Node(1);
}
tmp = tmp.right;
}
monitor >>>= 1;
}
}
// 2. å€æ床 O(31)
Node node = root;
int pow = 30;
// node != null 䞺äºé²æ¢åªæäžæ¡ååçº¿å¯ŒèŽ node == null
while(node != null && (node.left == null || node.right == null)) {
if(node.left == null) {
node = node.right;
} else {
node = node.left;
}
pow --;
}
if(node == null) {
return 0;
}
// node.left != null && node.right != null
// åºç°åæ¶ååš 0 & 1 çèç¹
return mySol(node.left, node.right, pow);
}
private int mySol(Node a, Node b, int pow) {
// éåœç»æ¢æ¡ä»¶
if(a == null || b == null) {
return 0;
}
int res = 0;
// æ± èç¹ a & èç¹ b çåŒæåŒ
if(a.val != b.val) {
// 该äœèŽ¡ç®äºäžä»œåŒæåŒ
res += (1 << pow);
}
// å€æåŸåªäžªæ¹åéåœ
// æ¯äžªèç¹æ 2 ç§åæ¯éæ©ïŒäœè¥æ¯èç¹åªæäžäžªåèç¹ïŒé£ä¹åªå©äžäžæ¡è·¯
if(a.left == null) {
// a.right != null --> a åªèœèµ° right æ¹åïŒæçæ³çæ
åµæ¯ b èœèµ° left æ¹å
// å€æ b èµ°åªäžªæ¹å
if(b.left != null) {
return res + mySol(a.right, b.left, pow - 1);
} else {
return res + mySol(a.right, b.right, pow - 1);
}
} else if(a.right == null) {
// a.left != null
if(b.right != null) {
return res + mySol(a.left, b.right, pow - 1);
} else {
return res + mySol(a.left, b.left, pow - 1);
}
} else {
// a.left != null && a.right != null
// äžè®ºèµ° b ç巊蟹è¿æ¯å³èŸ¹ïŒæ»èœæäžç§éæ©æ»¡è¶³åæ¶åºç° 1 & 0 çæ
åµ
return res + Math.max(mySol(a.left, b.right, pow - 1), mySol(a.right, b.left, pow - 1));
}
}
}
class Node {
int val;
Node left;
Node right;
public Node(int val) {
this.val = val;
}
}