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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值