1707.与数组中元素的最大异或值
链接:1707.与数组中元素的最大异或值
难度:Hard
标签:位运算、字典树、数组
简介:返回一个整数数组 answer 作为查询的答案,其中 answer.length == queries.length 且 answer[i] 是第 i 个查询的答案。
题解 1 - typescript
- 编辑时间:2021-05-23
- 执行用时:3000ms
- 内存消耗:122.9MB
- 编程语言:typescript
- 解法介绍:构建字典树,排序后计算最大可能异或值。
class Trie {
left: Trie | null = null;
right: Trie | null = null;
val: number | null = null;
}
function maximizeXor(nums: number[], queries: number[][]): number[] {
const root = new Trie();
const add = (num: number) => {
let node = root;
for (let i = 31; i >= 0; i--) {
const val = (num >> i) & 1;
if (val === 1) node = node.right ?? (node.right = new Trie());
else node = node.left ?? (node.left = new Trie());
node.val = num;
}
};
const select = (num: number): number => {
let node = root;
for (let i = 31; i >= 0; i--) {
const val = (num >> i) & 1;
if (val === 1) node = node.left ?? node.right!;
else node = node.right ?? node.left!;
}
return node.val!;
};
nums.sort((a, b) => a - b);
const queryMap = new Map<number[], number>();
queries.forEach((v, i) => queryMap.set(v, i));
queries.sort(([, a], [, b]) => a - b);
const ans: number[] = [];
for (const query of queries) {
const [x, m] = query;
while (nums.length > 0 && nums[0] <= m) add(nums.shift()!);
const index = queryMap.get(query)!;
ans[index] = root.left === null && root.right === null ? -1 : x ^ select(x);
}
return ans;
}