DeepSeek LeetCode 2935. 找出强数对的最大异或值 II JavaScript实现
这是 LeetCode 第 2935 题「找出强数对的最大异或值 II」的 JavaScript 实现。题目要求在数组中找到两个数 (x, y)满足 |x - y| min(x, y)即强数对并最大化 x XOR y 的值。思路分析1. 强数对条件转化|x - y| min(x, y) 等价于 max(x, y) 2 * min(x, y)也就是说较大的数不超过较小数的两倍。2. 排序 滑动窗口· 将数组升序排序· 对于每个位置作为右端点 nums[r]找到最小的 l 使得 nums[r] 2 * nums[l]· 窗口 [l, r] 内的任意元素都可以和 nums[r] 组成强数对3. 最大异或值在窗口内找与 nums[r] 异或最大的数可以用 二进制前缀树Trie 实现 O(32) 的查询和插入。代码实现javascript/*** param {number[]} nums* return {number}*/var maximumStrongPairXor function(nums) {nums.sort((a, b) a - b);// 二进制前缀树Trie节点class TrieNode {constructor() {this.children new Array(2).fill(null);this.count 0; // 记录有多少个数经过此节点}}class BinaryTrie {constructor() {this.root new TrieNode();}// 插入数字insert(num) {let node this.root;for (let i 20; i 0; i--) { // 2^21 2*10^5const bit (num i) 1;if (!node.children[bit]) {node.children[bit] new TrieNode();}node node.children[bit];node.count;}}// 删除数字从Trie中移除一个remove(num) {let node this.root;for (let i 20; i 0; i--) {const bit (num i) 1;node node.children[bit];node.count--;}}// 查询与num异或的最大值query(num) {let node this.root;let res 0;for (let i 20; i 0; i--) {const bit (num i) 1;const target 1 - bit; // 想要相反的位if (node.children[target] node.children[target].count 0) {res | (1 i);node node.children[target];} else {node node.children[bit];}}return res;}}const trie new BinaryTrie();let left 0;let maxXor 0;for (let right 0; right nums.length; right) {// 维护窗口 [left, right]满足 nums[right] 2 * nums[left]while (left right nums[right] 2 * nums[left]) {trie.remove(nums[left]);left;}// 查询当前最大异或值if (left right) {maxXor Math.max(maxXor, trie.query(nums[right]));}// 将当前数插入Trietrie.insert(nums[right]);}return maxXor;};算法复杂度· 时间复杂度O(n log C)n 是数组长度C 是数值范围这里取 2^21排序 O(n log n)每个数插入和查询 O(log C)。· 空间复杂度O(n log C)Trie 节点数。关键点说明· 由于 JavaScript 中位运算限制在 32 位整数但题目约束 nums[i] 2*10^5所以我们用 21 位足够2^21 2*10^5。· 滑动窗口保证了所有窗口内的数都可以和 nums[right] 构成强数对。· Trie 的 count 字段用于处理重复元素确保删除时不会误删其他数的路径。这样就能高效求出强数对的最大异或值。