LeetCode——421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array)[中等]——分析及代码(Java)

LeetCode——421. 数组中两个数的最大异或值[Maximum XOR of Two Numbers in an Array][中等]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 逐位计算 + 哈希表
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。

进阶:你可以在 O(n) 的时间解决这个问题吗?

示例 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 * 10^4
  • 0 <= nums[i] <= 2^31 - 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 逐位计算 + 哈希表

(1)思路

对 32 位整形数字,从高到低判断各个数位的异或值是否能得到 1。
设当前目标值为 target,假设 nums 中存在 2 个数字 num1 和 num2 满足 num1 ^ num2 = target,则等效于 num1 ^ target = num2。因此,可针对目标 target,在 nums 中遍历 num1 的同时确定是否存在 num2。

(2)代码

class Solution {
    public int findMaximumXOR(int[] nums) {
        int target = 0;//当前可能达到的最大异或值
        for (int i = 31; i >= 0; i--) {//从高到低逐位确定
            //记录nums中各元素前32-i位的数字,用于快速匹配
            Set<Integer> set = new HashSet<>();
            for (int num : nums)
                set.add(num >> i);
            
            target = (target << 1) + 1;//设当前可能达到的最大值第i位(即当前的末位)为1
            boolean hasNum = false;//第i位是否能达到1
            for (int num : nums) {
                if (set.contains((num >> i) ^ target)) {//num1^target=num2 <=> num1^num2=target
                    hasNum = true;
                    break;
                }
            }
            target = hasNum ? target : target - 1;//根据第i位是否能达到1设置target值
        }
        return target;
    }
}

(3)结果

执行用时 :83 ms,在所有 Java 提交中击败了 41.66% 的用户;
内存消耗 :38.8 MB,在所有 Java 提交中击败了 98.60% 的用户。

三、其他

还可结合字典树方法进行逐位计算。

你可能感兴趣的:(数据结构与算法,LeetCode,Java,题解)