题目:
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
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)
{
seen.insert(num >> k); // 为了保留从最高位开始到第 k 个二进制位为止的部分,只需将其右移 k 位
}
int x_next = x * 2 + 1; // 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
bool found = false; // 此处将 x 的第 k 个二进制位 置位 1,即 x * 2 + 1
for(int num : nums) // 用 for 循环枚举 i
{
if(seen.count(x_next ^ (num >> k)))
{
found = true;
break;
}
}
if(found)
{
x = x_next;
}
else
{
x = x_next - 1; // 如果没有找到满足等式的 a_i和a_j,那 x 的第 k 个二进制位只能为0
} // 即 x = x * 2;
}
return x;
}
};