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

Idea

假设选择了数组中的元素ai和aj使得它们达到最大按位异或结果x:x=ai⊕ajx=a_{i}⊕a_{j}x=ai​⊕aj​,其中⊕表示按位异或运算。

根据异或运算的性质,x=ai⊕ajx=a_{i}⊕a_{j}x=ai​⊕aj​等价于aj=ai⊕xa_{j}=a_{i}⊕xaj​=ai​⊕x,根据这一变换,可以设计一种[从高位到低位依次确定x二进制表示的每一位]的方法,以此得到x的值。

数组中的元素都在[0, 231)的范围内,可以将每一个数都表示为一个长度为31位的二进制数(不满31位补前导0)字符串,然后可以从最高位第30个二进制位开始依次确定x的每一位是0还是1。

由于需要找出最大的x,因此在枚举每一位时,需要先判断x的这一位是否能取到1,如果能,就取这一位为1,否则取这一位为0。

将字符串放入字典树中,那么在字符串中查询一个字符串的过程,就是从高位开始确定每一个二进制位的过程。

x=ai⊕ajx=a_{i}⊕a_{j}x=ai​⊕aj​,枚举ai,将a0, a1, …, ai-1作为aj放入字典树,希望找到使得x达到最大值的aj

从字典树的根节点开始进行遍历,遍历的[参照对象]为ai,根据ai的第x个二进制位时0还是1确定应该走哪个子节点。

假设当前遍历到第k个二进制位:

  • 如果ai的第k个二进制位为0,那么应该往表示1的子节点走。如果不存在表示1的子节点,就只能往表示0的子节点走。
  • 如果ai的第k个二进制位为1,那么应该往表示0的子节点走。如果不存在表示0的子节点,就只能往表示1的子节点走。

遍历完所有的31个二进制位后,得到ai可以通过异或运算得到的最大x。

Code

Python

from typing import Listclass Trie:def __init__(self):self.left, self.right = None, Noneclass Solution:def findMaximumXOR(self, nums: List[int]) -> int:root = Trie()HIGH_BIT = 30def add(num: int) -> None:cur = rootfor k in range(HIGH_BIT, -1, -1):bit = (num >> k) & 1if bit == 0:if not cur.left:cur.left = Trie()cur = cur.leftelse:if not cur.right:cur.right = Trie()cur = cur.rightdef check(num: int) -> int:cur = rootx = 0for k in range(HIGH_BIT, -1, -1):bit = (num >> k) & 1if bit == 0:if cur.right:cur = cur.rightx = x * 2 + 1else:cur = cur.leftx = x * 2else:if cur.left:cur = cur.leftx = x * 2 + 1else:cur = cur.rightx = x * 2return xn, x = len(nums), 0for i in range(1, n):add(nums[i - 1])x = max(x, check(nums[i]))return x

LeetCode 421. 数组中两个数的最大异或值相关推荐

  1. Leetcode :421. 数组中两个数的最大异或值 (位运算)

    421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ...

  2. LeetCode 421. 数组中两个数的最大异或值(Trie树)

    1. 题目 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, ...

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

    题目:421. 数组中两个数的最大异或值 题解:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/solu ...

  4. leetcode 421. Maximum XOR of Two Numbers in an Array | 421. 数组中两个数的最大异或值(位运算,Trie前缀树)

    题目 https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/ 题解 自己没有思路,看了答案之后自己写的. 参考:Py ...

  5. arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」

    今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值.在 异或 这个知识点里面属于一个中高难度的题目. 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, ...

  6. 数组中两个数的最大异或值 两数异或值一定小于两数相加和

    链接:数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间 ...

  7. leetcode421. 数组中两个数的最大异或值(贪心算法)

    给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间解决这个问题吗? 示例 1: 输 ...

  8. leetcode算法题--数组中两个数的最大异或值

    原题链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 1.方法一:暴力法 func findMax ...

  9. 两种方法求解 正数数组中 两个数相减 的最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标. 即求出: maxValue = max{arr[j]-arr[i] ...

最新文章

  1. connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...
  2. java util包类_java.util包下的类及常用方法
  3. MFC对话框绘制灰度直方图
  4. MySQL快速生成大量测试数据1000万
  5. 我的第一个 RN 项目-趣闻
  6. layui 读取本地excel内容_Python操作Excel基础(1)
  7. jquery特效 商品SKU属性规格选择实时联动
  8. Flex请求Php端的奇怪现象
  9. arcgis中editor在哪_leetcode 刷题工具 leetcode-editor 本地调试篇
  10. 北理乐学c语言,北京理工大学2018年计算机考研889数据结构考试大纲
  11. dnf手游体验服显示无法连接服务器,《DNF手游》体验服服务器人数上限怎么办 体验服服务器人数上限解决办法...
  12. Xcode ImageOptim Compress PNG Files
  13. .NET Reflector 7.6.1.824安装及破解(刚试了,绝对能用)
  14. F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析
  15. 自由地思考——保护思想环境
  16. IC前后端001:高扇出的危害
  17. css设置height无效,CSS中设置height:100%无效的解决方案
  18. C Programming FAQs: Frequently Asked Questions
  19. php 下载苹果应用ipa 苹果安装包下载
  20. 记录在苹果mac os系统上使用51单片机仿真软件Proteus

热门文章

  1. PHP错误处理函数set_error_handler()的用法
  2. StringBuffer(字符串缓冲区)
  3. 庖丁解牛看委托和事件(续)
  4. 单链表的快速排序(转)
  5. delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...
  6. python矩形打印_【Python】旋转打印各种矩形
  7. pageaudit属性不正确_科学的基本属性
  8. java构造函数调用其他程序的顺序_java初始化构造函数调用顺序
  9. Java黑皮书课后题第6章:6.11(金融应用:计算酬金)编写方法,利用编程练习题5.39中的方法计算酬金。方法头如下所示。编写程序,显示下面表格
  10. C语言学习之利用指针输出二维数组任一行任一列元素的值