LCR067.数组中两个数的最大异或值
链接:LCR067.数组中两个数的最大异或值
难度:Medium
标签:位运算、字典树、数组、哈希表
简介:给定一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
题解 1 - typescript
- 编辑时间:2021-10-25
- 执行用时:784ms
- 内存消耗:67.3MB
- 编程语言:typescript
- 解法介绍:二叉字典树。
const MAX = 31;
class BitTrieNode {
  // 0
  left: BitTrieNode | null = null;
  // 1
  right: BitTrieNode | null = null;
  val = -1;
}
class BitTrie {
  root = new BitTrieNode();
  add(num: number) {
    const str = num.toString(2).padStart(MAX, '0');
    let node = this.root;
    for (let i = 0, l = str.length; i < l; i++) {
      const ch = str[i];
      if (ch === '0') node = node.left ?? (node.left = new BitTrieNode());
      else node = node.right ?? (node.right = new BitTrieNode());
    }
    node.val = num;
  }
  find(num: number) {
    const str = num.toString(2).padStart(MAX, '0');
    let node = this.root;
    for (let i = 0, l = str.length; i < l; i++) {
      if (!node.left && !node.right) break;
      const ch = str[i];
      if (ch === '0') {
        node = node.right ?? node.left!;
      } else {
        node = node.left ?? node.right!;
      }
    }
    return node;
  }
}
function findMaximumXOR(nums: number[]): number {
  const trie = new BitTrie();
  nums.forEach(num => trie.add(num));
  trie.find(5).val;
  let ans = -Infinity;
  nums.forEach(num => {
    ans = Math.max(ans, trie.find(num).val ^ num);
  });
  return ans;
}