剑指 Offer II 067. 最大的异或

91 阅读1分钟

剑指 Offer II 067. 最大的异或

由于数组中的元素都在 [0, 2^31)的范围内,那么我们可以将每一个数表示为一个长度为 31位的二进制数,如果不满 31位,在最高位之前补上若干个前导0即可

这31个二进制位从低位到高位依次编号为 0, 1,⋯,30,我们从最高位第 30个二进制位开始,依次确定x的每一位是0还是1

由于我们需要找出最大的x,因此在枚举每一位时,我们先判断 xx 的这一位是否能取到1。如果能,我们取这一位为1,否则我们取这一位为0。

var findMaximumXOR = function(nums) {
    const HIGH_BIT = 30;
    let x = 0;
    for (let k = HIGH_BIT; k >= 0; --k) {
        const seen = new Set();
        for (const num of nums) {
            seen.add(num >> k);
        }
        const xNext = x * 2 + 1;
        let found = false;
        for (const num of nums) {
            if (seen.has(xNext ^ (num >> k))) {
                found = true;
                break;
            }
        }
        if (found) {
            x = xNext;
        } else {
            x = xNext - 1;
        }
    }
    return x; 
};