首页 > 编程语言 > 详细

421. 数组中两个数的最大异或值

时间:2021-05-17 13:18:00      阅读:15      评论:0      收藏:0      [点我收藏+]
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。
进阶:你可以在 O(n) 的时间解决这个问题吗?
题解:
  x=ai?aj 等价于 aj?=xai,设计一种「从高位到低位依次确定 x 二进制表示的每一位」的方法,其精髓在于
  1)如果x满足aj?=xai,那么其高位部分也满足aj?=xai。
  2)由于我们需要找出最大的 x,因此在枚举每一位时,我们先判断 x 的这一位是否能取到 1。??
  方法一:哈希表
  1. 如何判断 x 的k位是否能取到 1,我们先将数组前k+1位保存到集合seen中。
  2. 假设x 包含从最高位开始到第 k+1 个二进制位为止的部分,则前k位为 xNext = x*2+1。
  3. 枚举nums,查询集合seen中是否存在 xNext ^(num>>i)。
var findMaximumXOR = function(nums) {
    const HIGH_BIT = 30;
    let x = 0;
    for(let i=HIGH_BIT;i>=0;i--){
        let seen = new Set();
        for(let num of nums){
            seen.add(num>>i);
        }

        let xNext = 2*x+1;
        let found = false;
        for(let num of nums){
            if(seen.has(xNext^(num>>i))){
                found = true;
                break;
            }
        }
        if(found){
            x = xNext;
        }else{
            x = xNext - 1;
        }
    }
    return x;
}
let nums  = [3,10,5,25,2,8]
console.log(nums, findMaximumXOR(nums));

nums  =  [0]
console.log(nums, findMaximumXOR(nums));
nums  =  [2,4]
console.log(nums, findMaximumXOR(nums));
nums  = [8,10,2]
console.log(nums, findMaximumXOR(nums));

nums  = [14,70,53,83,49,91,36,80,92,51,66,70]
console.log(nums, findMaximumXOR(nums));

示例 1:

输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.
示例 2:
输入:nums = [0]
输出:0
示例 3:
输入:nums = [2,4]
输出:6
示例 4:
输入:nums = [8,10,2]
输出:10
示例 5:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127 

 

提示:
1 <= nums.length <= 2 * 104
0 <= nums[i] <= 231 - 1

421. 数组中两个数的最大异或值

原文:https://www.cnblogs.com/yanjianjiang/p/14776212.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!