1. 题目来源
相关题目:[字典树] 最大异或对(trie+贪心)
2. 题目解析
虽说是个相关题目,其实解法上并不相关。最大异或对 是两个数之间的异或,而本题确实一堆数之间的异或。再细考虑一下,可以采用异或运算的性质直接解决。
思路:
- 前缀异或一个
0~2^k-1
值,保证异或值要最大,那么显然这个2^k-1
值是可以取到的。只需要与前缀的异或值 0 1 取反即可。 - 由 a ⊗ b = c a \otimes b=c a⊗b=c,则可以推得 a ⊗ c = b a\otimes c = b a⊗c=b,这也是显然的。
- 故只需要维护一个前缀和,每次与
2^k-1
异或即可得到所求值,最后逆置整个数组即可。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
代码:
class Solution {
public:
vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
int n = nums.size(), t = 0;
vector<int> ans;
for (int i = 0; i < n; i ++ ) {
t ^= nums[i];
ans.push_back(t ^ (1 << maximumBit) - 1);
}
reverse(ans.begin(), ans.end());
return ans;
}
};