题目如下
给定一个整数数组 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 = [0]
输出:0
示例 3:
输入:nums = [2,4]
输出:6
示例 4:
输入:nums = [8,10,2]
输出:10
示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127
解题思路
解题代码
class Solution
{
private:
//最高位的二进制位编号为 30
static constexpr int HIGH_BIT = 30;
public:
int findMaximumXOR(vector<int>& nums)
{
int x = 0;
for (int k = HIGH_BIT; k >= 0; --k)
{
unordered_set<int> seen;
//将所有的 pre^k(a_j) 放入哈希表中
for (int num : nums)
{
//如果只想保留从最高位开始到第 k 个二进制位为止的部分
//只需将其右移 k 位
seen.insert(num >> k);
}
//目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
//我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1
int x_next = x * 2 + 1;
bool found = false;
//枚举 i
for (int num : nums)
{
if (seen.count(x_next ^ (num >> k)))
{
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;
}
};
复杂度分析
时间复杂度:O(nlogC),其中 n 是数组 nums 的长度,C 是数组中的元素范围,在本题中C<2 ^ 31
。
枚举答案 x 的每一个二进制位的时间复杂度为 O(logC),在每一次枚举的过程中,我们需要 O(n) 的时间进行判断,因此总时间复杂度为 O(nlogC)。
空间复杂度:O(n),即为哈希表需要使用的空间。