题目来源
题目描述
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
}
};
题目解析
因为1<=nums.length < 2 ∗ 1 0 4 2 * 10^4 2∗104,又因为指令数最大 1 0 8 10^8 108
- 如果算法的时间复杂度为O(N^2),那么指令数
4 * 10^8
,那么会超时 - 也就是必须用O(N)或者O(N*logN)的算法
怎么办呢?可以用前缀数的方法,具体解析看算法:最大子数组异或和,它们之间的唯一区别是之前是将异或和加入前缀树,这里直接把数组加入到结构里
#include <memory>
struct TrieNode {
std::vector<std::shared_ptr<TrieNode>> next;
explicit TrieNode() : next(2, NULL){
}
};
class NumTrie{
std::shared_ptr<TrieNode> head = std::make_shared<TrieNode>();
public:
void add(int num){
auto curr = head;
for (int i = 31; i >= 0; --i) {
int path = (num >> i) & 1;
curr->next[path] = curr->next[path] == nullptr ? std::make_shared<TrieNode>() : curr->next[path];
curr = curr->next[path];
}
}
int maxXor(int num){
int ans = 0;
auto curr = head;
for (int i = 31; i >= 0; --i){
int path = (num >> i) & 1;
int best = i == 31 ? path : path ^ 1;
best = curr->next[best] == nullptr ? best ^ 1 : best;
curr = curr->next[best];
ans |= ((path ^ best) << i);
}
return ans;
}
};
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
if(nums.empty()){
return 0;
}
// 0 ≤ i ≤ j < n
int max = INT32_MIN;
NumTrie numTrie;
for (int num : nums) {
numTrie.add(num);
max = std::max(max, numTrie.maxXor(num));
}
return max;
}
};