最大的异或

121 阅读1分钟

image.png

位运算

  1. 将每一个具体的 位 进行试探
  2. 从最高的一位开始,到最高的两位,到前三位
  3. 每次都将 nums 的前几位计入 map 中
  4. 这样只需要将 map 中的每一个元素 与 我们假设存在的 xNext 异或运算之后的答案再在 map 找看看是否存在即可
  5. 如果存在,x 继承 xNext,不存在,则说明我们的假设当前位为 1 不对,继承 xNext - 1 即可
func findMaximumXOR(nums []int) (x int) {
    const highBit = 30 // 最高位的二进制位编号为 30
    for k := highBit; k >= 0; k-- {
        // 将所有的 pre^k(a_j) 放入哈希表中
        seen := map[int]bool{}
        for _, num := range nums {
            // 如果只想保留从最高位开始到第 k 个二进制位为止的部分
            // 只需将其右移 k 位
            seen[num>>k] = true
        }

        // 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
        // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1
        xNext := x*2 + 1
        found := false

        // 枚举 i
        for _, num := range nums {
            if seen[num>>k^xNext] {
                found = true
                break
            }
        }
        // 下面这种就是我所写的题解步骤中对应的步骤 4 ,当然效果跟上面代码一样
        // for num := range seen {
        //     if seen[num^xNext] {
        //         found = true
        //         break
        //     }
        // }

        if found {
            x = xNext
        } else {
            // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0
            // 即为 x = x*2
            x = xNext - 1
        }
    }
    return
}

或者不用哈希表,用字典树的方法,效果也是位运算