LeetCode 421. 数组中两个数的最大异或值
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. 数组中两个数的最大异或值相关推荐
- Leetcode :421. 数组中两个数的最大异或值 (位运算)
421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ...
- LeetCode 421. 数组中两个数的最大异或值(Trie树)
1. 题目 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, ...
- 421. 数组中两个数的最大异或值
题目:421. 数组中两个数的最大异或值 题解:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/solu ...
- 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 ...
- arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」
今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值.在 异或 这个知识点里面属于一个中高难度的题目. 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, ...
- 数组中两个数的最大异或值 两数异或值一定小于两数相加和
链接:数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间 ...
- leetcode421. 数组中两个数的最大异或值(贪心算法)
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n . 进阶:你可以在 O(n) 的时间解决这个问题吗? 示例 1: 输 ...
- leetcode算法题--数组中两个数的最大异或值
原题链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 1.方法一:暴力法 func findMax ...
- 两种方法求解 正数数组中 两个数相减 的最大值
一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标. 即求出: maxValue = max{arr[j]-arr[i] ...
最新文章
- connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...
- java util包类_java.util包下的类及常用方法
- MFC对话框绘制灰度直方图
- MySQL快速生成大量测试数据1000万
- 我的第一个 RN 项目-趣闻
- layui 读取本地excel内容_Python操作Excel基础(1)
- jquery特效 商品SKU属性规格选择实时联动
- Flex请求Php端的奇怪现象
- arcgis中editor在哪_leetcode 刷题工具 leetcode-editor 本地调试篇
- 北理乐学c语言,北京理工大学2018年计算机考研889数据结构考试大纲
- dnf手游体验服显示无法连接服务器,《DNF手游》体验服服务器人数上限怎么办 体验服服务器人数上限解决办法...
- Xcode ImageOptim Compress PNG Files
- .NET Reflector 7.6.1.824安装及破解(刚试了,绝对能用)
- F2FS源码分析-2.3 [F2FS 读写部分] F2FS的一般文件读流程分析
- 自由地思考——保护思想环境
- IC前后端001:高扇出的危害
- css设置height无效,CSS中设置height:100%无效的解决方案
- C Programming FAQs: Frequently Asked Questions
- php 下载苹果应用ipa 苹果安装包下载
- 记录在苹果mac os系统上使用51单片机仿真软件Proteus
热门文章
- PHP错误处理函数set_error_handler()的用法
- StringBuffer(字符串缓冲区)
- 庖丁解牛看委托和事件(续)
- 单链表的快速排序(转)
- delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...
- python矩形打印_【Python】旋转打印各种矩形
- pageaudit属性不正确_科学的基本属性
- java构造函数调用其他程序的顺序_java初始化构造函数调用顺序
- Java黑皮书课后题第6章:6.11(金融应用:计算酬金)编写方法,利用编程练习题5.39中的方法计算酬金。方法头如下所示。编写程序,显示下面表格
- C语言学习之利用指针输出二维数组任一行任一列元素的值