421. 数组中两个数的最大异或值 (中等,位运算)

题目越短越难啊

  1. 关键在于要明白如果我们已经知道有一些组合进行异或运算能得到最高位为1的结果,那么最终答案必定在这些组合之中
  2. 其次异或运算有个性质,a=b XOR c 等价于 b=a XOR c,因此对于第 k 位能否取到 1 的情况,我们只需要用 2k 去和每一个nums[i] 作异或运算,然后通过哈希表(把所有的nums塞入表中)查找耗时 O(1) 的性质去找 nums[i] 是否存在,所以最终的耗时为 O(nk),其中 k 为最高位的位数
python 复制代码
class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        # 最高位的二进制位编号为 30
        HIGH_BIT = 30

        x = 0
        for k in range(HIGH_BIT, -1, -1):
            seen = set()
            # 将所有的 pre^k(a_j) 放入哈希表中
            for num in nums:
                # 如果只想保留从最高位开始到第 k 个二进制位为止的部分
                # 只需将其右移 k 位
                seen.add(num >> k)

            # 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
            # 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1
            x_next = x * 2 + 1
            found = False
            
            # 枚举 i
            for num in nums:
                if x_next ^ (num >> k) in seen:
                    found = True
                    break

            if found:
                x = x_next
            else:
                # 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0
                # 即为 x = x*2
                x = x_next - 1
        
        return x
相关推荐
这里有鱼汤7 分钟前
“对象”?对象你个头!——Python世界观彻底崩塌的一天
后端·python
尘浮72817 分钟前
60天python训练计划----day59
开发语言·python
wh393320 分钟前
使用Python将PDF转换成word、PPT
python·pdf·word
三维重建-光栅投影29 分钟前
VS中将cuda项目编译为DLL并调用
算法
船长@Quant37 分钟前
数学视频动画引擎Python库 -- Manim Voiceover 语音服务 Speech Services
python·数学·manim·动画引擎·语音旁白
好开心啊没烦恼2 小时前
Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?
开发语言·python·数据挖掘·数据分析·pandas
lljss20203 小时前
Python11中创建虚拟环境、安装 TensorFlow
开发语言·python·tensorflow
课堂剪切板3 小时前
ch03 部分题目思路
算法
空中湖3 小时前
tensorflow武林志第二卷第九章:玄功九转
人工智能·python·tensorflow
山登绝顶我为峰 3(^v^)34 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex