0421:数组中两个数的最大异或值(★)
目录
题目
给你一个整数数组 nums
,返回 nums[i] XOR nums[j]
的最大运算结果,其中 0 ≤ i ≤ j < n
。
示例 1:
输入:nums = [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出:127
提示:
1 <= nums.length <= 2 * 105
0 <= nums[i] <= 231 - 1
相似问题:
- 1707:与数组中元素的最大异或值(2358 分)
- 2317:操作后的最大异或和(1678 分)
- 2416:字符串的前缀分数和(1725 分)
- 2429:最小异或(1532 分)
- 2932:找出强数对的最大异或值 I(1246 分)
- 2935:找出强数对的最大异或值 II(2348 分)
分析
#1
经典的位运算问题,可以采用试填法:
- 为了使结果最大,应该尽可能让二进制的高位取 1
- 假如前 k-1 位能取到的最大值为 M,接下来要使前 k位尽量取到 M’=(M«1)+1
- 假设有两个数的 k 位前缀 x、y 满足 x^y=M’,M’ 即能取到
- 根据异或的重要性质:如果 x^y=M’,那么 M’^x=y
- 因此将 k 位前缀保存在哈希表中,遍历判断即可
|
|
611 ms
#2
- 更通用的方法是用 01 字典树
- 将每个数的二进制串插入字典树
- 然后对于每个数,查找最大的异或结果,依然是试填法
- 假如第 k 位为 bit,bit^1 在字典树中,那么该位可以取 1,并且树中往 bit^1 走
- 否则该位取 0,字典树中往 bit 走
- 01 字典树用数组形式可以优化时间
解答
|
|
3025 ms