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. 数组中两个数的最大异或值

LeetCode 421. 数组中两个数的最大异或值 Java 前缀树

LeetCode 421. 数组中两个数的最大异或值 Java 前缀树

LeetCode 421. 数组中两个数的最大异或值 Java 前缀树

追寻最优美的代码 leetcode 421. 数组中两个数的最大异或值