[leetCode]421. 数组中两个数的最大异或值

题目

https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/

在这里插入图片描述

哈希表

class Solution {
    public int findMaximumXOR(int[] nums) {
        int maxNum = Arrays.stream(nums).max().getAsInt();
        // 最大数字的位数
        int L = Integer.toBinaryString(maxNum).length();

        int maxXor = 0, curXor;
        Set<Integer> prefixes = new HashSet<>();
        for (int i = L - 1; i >= 0; i--) {
            maxXor <<= 1;// 
            curXor = maxXor | 1;
            prefixes.clear();
            for (Integer num : nums) {
                prefixes.add(num >> i);
            }
            for (Integer p : prefixes) {
                if (prefixes.contains(curXor ^ p)) {
                    maxXor = curXor;
                }
            }
        }
        return maxXor;
    }
}

前缀树

class Solution {
    public int findMaximumXOR(int[] nums) {
        // 1. 计算最大的位数
        int maxNum = Arrays.stream(nums).max().getAsInt();
        int L = Integer.toBinaryString(maxNum).length();
        // 2. 将原数字转化为2进制字符串,bitMask保证字符串有5位
        int n = nums.length , bitMask = 1 << L, idx = 0;
        String[] strNums = new String[n];
        for (Integer num : nums) {
            strNums[idx++] = Integer.toBinaryString(bitMask | num);
        }

        TrieNode root = new TrieNode();
        int maxXor = 0;
        for (String num : strNums) {
            TrieNode cur = root, xorCur = root;
            int curXor = 0;
            for (char bit : num.toCharArray()) {
                cur = cur.children.computeIfAbsent(bit, k -> new TrieNode());
                char toggleBit = bit == '1' ? '0' : '1';
                
                if (xorCur.children.containsKey(toggleBit)) {
                    curXor = (curXor << 1) | 1;
                    xorCur = xorCur.children.get(toggleBit);
                } else {
                    curXor = curXor << 1;    
                    xorCur = xorCur.children.get(bit);
                } 
            }
            maxXor = Math.max(maxXor, curXor);
        }
        return maxXor;
    }

    class TrieNode {
        Map<Character, TrieNode> children;
        TrieNode() {
            children = new HashMap<>();
        } 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值