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
相关推荐
liu****6 小时前
20.哈希
开发语言·数据结构·c++·算法·哈希算法
这里有鱼汤6 小时前
📊量化实战篇:如何计算RSI指标的“拥挤度指标”?
后端·python
JJJJ_iii6 小时前
【机器学习05】神经网络、模型表示、前向传播、TensorFlow实现
人工智能·pytorch·python·深度学习·神经网络·机器学习·tensorflow
William.csj6 小时前
服务器/Pytorch——对于只调用一次的函数初始化,放在for训练外面和里面的差异
人工智能·pytorch·python
夏鹏今天学习了吗6 小时前
【LeetCode热题100(47/100)】路径总和 III
算法·leetcode·职场和发展
Ingsuifon7 小时前
pytorch踩坑记录
人工智能·pytorch·python
smj2302_796826527 小时前
解决leetcode第3721题最长平衡子数组II
python·算法·leetcode
m0_626535207 小时前
力扣题目练习 换水问题
python·算法·leetcode
第六五7 小时前
DPC和DPC-KNN算法
人工智能·算法·机器学习
一匹电信狗7 小时前
【LeetCode_160】相交链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl