leetcode 421. Maximum XOR of Two Numbers in an Array
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231.
Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.
Could you do this in O(n) runtime?
Example:
Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28.
/** * @param {number[]} nums * @return {number} */ var findMaximumXOR = function(nums) { var res =0,mask = 0; for (var i = 30; i >= 0; --i) { mask |= (1 << i); //console.log(mask.toString(2)); var s = new Set(); for (var num of nums) { s.add(num & mask); } //console.log(s) var t = res | (1 << i); //console.log(t.toString(2)) var count = 0; for (var prefix of s) { if (s.has(t ^ prefix)) { count++; } if (count) { res = t; break; } } } return res; };
题目中给定了数字的返回不会超过231,那么最多只能有32位,我们用一个从左往右的mask,用来提取数字的前缀,然后将其都存入set中,我们用一个变量t,用来验证当前位为1再或上之前结果res,看结果和set中的前缀异或之后在不在set中,这里用到了一个性质,若a^b=c,那么a=b^c,因为t是我们要验证的当前最大值,所以我们遍历set中的数时,和t异或后的结果仍在set中,说明两个前缀可以异或出t的值,所以我们更新res为t,继续遍历