Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

    • 338. 比特位计数
    • 6471. 得到整数零需要执行的最少操作数
    • 2859. 计算 K 置位下标对应元素的和
    • 260. 只出现一次的数字 III
    • 421. 数组中两个数的最大异或值
      • 1.位掩码+异或运算
      • 2935. 找出强数对的最大异或值 II
    • 剑指offer65
    • 剑指 Offer 15. 二进制中1的个数
    • 剑指 Offer 16. 数值的整数次方
    • 剑指 Offer 43. 1~n 整数中 1 出现的次数
    • 剑指 Offer 44. 数字序列中某一位的数字
    • 剑指 Offer 56 - II. 数组中数字出现的次数 II
  • WA

  • 算法
  • 位运算
phan
2023-11-05
目录

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

# 421. 数组中两个数的最大异或值 (opens new window)

# 1.位掩码+异或运算

本题利用异或运算一个重要性质:假设a^b=c,那么这个三个数的顺序任意交换依然成立,a^c=b。

根据题意,我们需要确定一个31位二进制数上,每个位置是否可以等于1,最理想情况都为1肯定是最大的。常规做法下两两异或运算,再判断该位是否为1,复杂度n方超时。而利用上述性质,可以将判断“数组存在两个数的异或运算结果使该位为1”这件事的复杂度降为O(n)。

  • 使用哈希表存储每个前缀掩码,假设当前这个数的前缀掩码与"期望最大结果"的异或运算结果在哈希表中,那么说明数组存在两个数可以保证第i位上的二进制编码为1,否则为0。
  1. 假设i=3,res=1100,数组二进制表示分别为1100,0001,0110
  2. 进行掩码运算获取对应的前缀。因为在第三位上11^11=00,而00是存在的,因此1100可以组合得到。
  3. 当i=2时,因为不存在和111异或结果也在哈希表的数,因此第二位只能为0,即使res=1100
class Solution {
    public int findMaximumXOR(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int max = Integer.MAX_VALUE-(Integer.MAX_VALUE>>1);
        int mask = 0;
        int res=0;
        for (int i = 31; i >= 0; i--) {
            mask += max;
            res += max;
            for (int num : nums) {
                int a = mask & num;
                map.put(a, map.getOrDefault(a, 0) + 1);
            }
            boolean check = false;
            for (int num : nums) {
                int numMask = mask & num;
                int ans = numMask ^ res;
                if (map.containsKey(ans)) {
                    check = true;
                    break;
                }
            }
            if(!check) res -= max;
            map.clear();
            max = max >> 1;
        }
        return res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 2935. 找出强数对的最大异或值 II (opens new window)

相同思路。枚举每个二进制比特位判断是否可以等于1时,还需要加一层判断,是否满足不等式关系。

编辑 (opens new window)
#Leetcode
上次更新: 2023/12/15, 15:49:57
260. 只出现一次的数字 III
剑指offer65

← 260. 只出现一次的数字 III 剑指offer65→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式