[Leetcode421](python): 数组中两个数之间最大的异或值

[Leetcode421](python): 数组中两个数之间最大的异或值,第1张

给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 。找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n 。你能在O(n)的时间解决这个问题吗?

示例:

根据 Trie Tree(字典树/前缀树/单词查找树) 对Trie基本结构的描述,编写构建结点,以及构建trie树,以及trie树的基本 *** 作方法。

本题的解题思路:Trie树 + 位运算

对于25 (0000 0000 0000 0000 0000 0000 0001 1001) 而言,使得异或结果最大的数x为0000 0000 0000 0000 0000 0000 000

从根节点开始搜索,node = root,直至到第5位,当前node为第6位右分支。

25第5位为1,则x的第5位为0,结果为最大,选择右分支,node = nodezero;

25第4位为1,则x的第4位为0,结果为最大,选择右分支,node = nodezero;

25第3位为0,则x的第3位为1,结果为最大,选择左分支,node = nodeone;

25第2位为0,则x的第2位为1,结果为最大,当前nodeone为空,所以选择nodezero, node = nodezero;

25第1位为1,则x的第1位为0,结果为最大,当前nodezero为空,所以选择nodeone, node = nodeone;最终找到x为5(00101)。

对于数组中每一个数进行上述 *** 作,更新最大异或值。

建立Trie树的时间复杂度是O(32n),这里的32即Trie树的键值最大长度;Trie树的高度为32,因此查找每个数的最大异或值得时间复杂度是O(32n),合起来是O(64n)也即时间复杂度为O(n)

>

给定一个数组,求子数组的最大异或和。

一个数组的异或和为,数组中所有的数异或起来的结果

三层循环,时间复杂度为O(n^3)

start--i的异或结果为0--i的异或结果^0---start的异或结果

两层循环,时间复杂度为O(n^2),空间换时间

前缀树也叫字典树,是处理字符串的常见的数据结构

(1)根节点没有字符路径,除根节点外,每一个结点都被一个字符路径找到

(2)从根节点到某一节点,除路径上经过的字符连接起来,为扫过的对应字符串

(3)每个节点下上的所有的字符路径上的字符都不同

int path=((num>>move)&1);将int的32位的每一位都分离出来

传入一个值,遍历每一位,int path=(num>>move)&1;得到当前的位数

如果当前的位数为31,即当前为符号位,则选择本身( 符号位如果是1,选择1异或变为正,0也是这样 ),其他位置尽量为1,则path^1;

best=curnexts[best]!=nullbest:(best^1);

如果期待的位置不为空,则走,如果为空,只能走异或的情况

res |=(path^best)<<move;将得到的值移动到对应的位数

概述

i = 14,异或算法转换二进制,同则取0异则取1;

解析

异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个进制位同值则取0,异值则取1

简单理解就是不进位加法,如1+1=0,0+0=0,1+0=1

For example:

3^5 = 6

转成二进制后就是 0011 ^ 0101 二号位和三号位都是异值取1 末尾两个1同值取零,所以3^5 = 0110 = 6

而 i = 50 ,j = 60;

所以:

i 的二进制 = 00110010

j 的二进制 = 00111100

同位相同取0,不同取1所以得出来的值为00001110

i = i ^ j;所以i = 00001110 = 14

拓展内容

异或运算符

性质

1、交换律 

2、结合律(即(a^b)^c == a^(b^c)) 

3、对于任何数x,都有x^x=0,x^0=x 

4、自反性 A XOR B XOR B = A xor 0 = A

异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。 例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) : 

A=A XOR B (a XOR b) 

B=B XOR A (b XOR a XOR b = a) 

A=A XOR B (a XOR b XOR a = b)

#code:

google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?

异或 *** 作(相同为0,不同为1),if里面是交换两个数

a[1]=36=100100

a[2]=20=10100

a = a ^ (a + 1); 100100^ 10100=110000

( a+1 ) = a ^ (a + 1); 110000^10100=100100=36

a = a ^ (a + 1); 110000^100100=010100=20

以上就是关于[Leetcode421](python): 数组中两个数之间最大的异或值全部的内容,包括:[Leetcode421](python): 数组中两个数之间最大的异或值、字符数组 异或、子数组的最大异或和等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9850881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存