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

Posted oyzg

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