LeetCode 421. 数组中两个数的最大异或值 Java 前缀树
Posted 醉苼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 421. 数组中两个数的最大异或值 Java 前缀树相关的知识,希望对你有一定的参考价值。
Java 前缀树
链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/solution/java-qian-zhui-shu-by-oyzg-ualc/
这里我只画了5和25了
代码:
class Solution {
class Node {
//只有0和1两种可能
Node[] children = new Node[2];
}
static final int MAX_BIT = 31;
static final int MIN_BIT = 0;
Node root = new Node();
//获得n的i比特位
public int getBit(int n, int i) {
return (n>>>i)&1;
}
//初始化前缀树
public void init_trie(int[] nums) {
for(int num : nums) {
Node cur = root;
for(int i = MAX_BIT; i >= MIN_BIT; i--) {
int bit = getBit(num, i);
Node node = cur.children[bit];
if(node == null) {
node = new Node();
cur.children[bit] = node;
}
cur = node;
}
}
}
//求最大异或值
public int helper(int[] nums) {
int ans = Integer.MIN_VALUE;
for(int num : nums) {
Node cur = root;
int sum = 0;
for(int i = MAX_BIT; i >= MIN_BIT; i--) {
int bit = getBit(num, i);
int xorBit = bit^1;
//如果有和num的第i位相反的,就往反的这边走
Node node = cur.children[xorBit];
if(node == null) {
node = cur.children[bit];
} else {
sum += (1<<i);
}
cur = node;
}
ans = Math.max(ans, sum);
}
return ans;
}
public int findMaximumXOR(int[] nums) {
init_trie(nums);
return helper(nums);
}
}
以上是关于LeetCode 421. 数组中两个数的最大异或值 Java 前缀树的主要内容,如果未能解决你的问题,请参考以下文章
leetcode-421-数组中两个数的最大异或值*(前缀树)
LeetCode 421. 数组中两个数的最大异或值 Java 前缀树
LeetCode 421. 数组中两个数的最大异或值 Java 前缀树