这题要求On时间复杂度完成, 第一次做事没什么思路的, 答案网上有不贴了, 总结下这类题的思路.

不局限于这个题, 凡是对于这种给一个  数组,  求出 xxx 最大值的办法, 可能上来默认就是dp, 但是注意如果要求On复杂度, 毫无疑问是不能用dp的, 因为dp至少是On2了对吧.

那么需要处理的元素长度为N, 如何在On实现呢,   关键点在于" 反推" 的思路, 我这里反推的意思是 从结果推倒, 而不是通过数据一个个计算看是否满足结果.

举例,  一般DP题目就是使用 dp[x] 这样的变量来保存结果, 然后遍历所有数据完成得到答案, 把这种思路称之为正推法.

那么,  反过来, "遍历答案"  找出是否存在就是反推了.

以这题为例, 答案的解法是从最高位开始,一步步判断是否存在 a和b  使得 a^b 最大, 要一个int值最大,毫无疑问就是每位都是1,

所以 用伪代码来表示思想就是

for i= 0xfffffff -> 0
if exist a ^ b = i
break;  

得到这个思想以后,  使用一个hash结构来保存所有的数组元素就可以变为On复杂度,  因为要求的是存在与否,  不需要顺序, hash就恰好解决了这个问题

首先得出基本思路

问题:  在数组A 里面求满足 xxx 条件的 最大/小 值  B ?   要求Ai ^ Aj = B

copy  A to   Hash<int> C
for max = 0xffffffff -> 1
for Ai in A
for Aj in B
if Ai ^ Aj = max return
这样有三重循环, 开始优化
for max = 0xffffffff -> 1 可变为按位处理 for i = 32->1 , 32位整数, 从最高位开始处理
for Ai in A
for Aj in B 这有两重循环, 使用hash可以去掉一层循环 由于xor操作存在交换律 a^b=c 可以得到 a^c=b ; 最终结论 伪代码 max=0
mask=0
for i = 32 -> 1
  mask=mask| 1<<i mask得到第i位是1的数; 第一轮mask是 100000, 第二轮 11000 第三轮 1110000 ...
  for Ai in A 对数组的每个元素存储第i位
    Ai & 1<<i - > hash 存入hash
  for hi in hash
    if max ^ hi in hash 我们要求 a ^ b = 最大数, 反过来这里判断 最大数 ^ a 是否存在于hash
      更新max值
好了 这里 仍然有个 32到1 的循环, 由于是固定次数, 所以真正的循环只有for Ai in A 和 for hi in hash , 两者没有嵌套关系, 也就是On复杂度了

  

421. Maximum XOR of Two Numbers in an Array的更多相关文章

  1. [LeetCode] 421. Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  2. 421. Maximum XOR of Two Numbers in an Array——本质:利用trie数据结构查找

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  3. [LeetCode] 421. Maximum XOR of Two Numbers in an Array(位操作)

    传送门 Description Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Fin ...

  4. 【LeetCode】421. Maximum XOR of Two Numbers in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 依次遍历每一位 前缀树 日期 题目地址:https://lee ...

  5. 421 Maximum XOR of Two Numbers in an Array 数组中两个数的最大异或值

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

  6. leetcode 421.Maximum XOR of Two Numbers in an Array

    题目中给定若干个数,然后任意选定两个数使得其异或值最大. 先利用样例中的: 3 10 5 25 2 8 这些数转换为二进制来看的话那么是先找到最高位的1然后与数组中其他的数相与后的数值保存到set中去 ...

  7. 【leetcode】421. Maximum XOR of Two Numbers in an Array

    题目如下: 解题思路:本题的难点在于O(n)的复杂度.为了减少比较的次数,我们可以采用字典树保存输入数组中所有元素的二进制的字符串.接下来就是找出每个元素的异或的最大值,把需要找最大值的元素转成二进制 ...

  8. LeetCode 421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array) 71

    421. 数组中两个数的最大异或值 421. Maximum XOR of Two Numbers in an Array 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, - , a ...

  9. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

随机推荐

  1. Not supported for DML operations

    问题原因 缺失@Modifying注解 问题解决 在自定义的修改方法(delete.update)上面除了@Transactional注解和@Query还需要@Modifying注解 Bug重现 or ...

  2. 使用python+hadoop-streaming编写hadoop处理程序

    Hadoop Streaming提供了一个便于进行MapReduce编程的工具包,使用它可以基于一些可执行命令.脚本语言或其他编程语言来实现Mapper和 Reducer,从而充分利用Hadoop并行 ...

  3. 友盟分享因为Bundle Id 校验不通过 无法分享到微信

    微信分享应用里面资料有个APP bundle id需要填的, 以前申请的时候不需要填也可以正常分享, 但是最近开始微信需要验证, 在那填上APP对应bundle ID 就可以了

  4. react-native android/ios 根据配置文件编译时自动修改版本号

    开发react-native时大都有过这个操作,当版本迭代时候要修改app版本号时,一般都这样做 Android: 的要修改build.gradle文件的versionName ios: 打开xcod ...

  5. css js 兼容问题

    js  兼容问题 1. document.form.item 问题问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运 ...

  6. JxBrowser之三:常用函数setNetworkDelegate

    1.常用函数setNetworkDelegate,包含对网络传输数据状态的多种监控回调. 2.着重说一下其中的几个函数 BrowserContext browserContext = BrowserC ...

  7. spark的二次排序

    通过scala实现二次排序 package _core.SortAndTopN import org.apache.spark.{SparkConf, SparkContext} /** * Auth ...

  8. python安装pyMysql

    python2和python3是不兼容的,在python2中,链接数据库使用的是mysqldb,但在python3中是是pyMysql. 1.首先dos进入python安装目录,找到并进入Script ...

  9. Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)

    源码地址https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器h ...

  10. PHP_CodeSniffer 安装和phpstorm配置

    安装 1.mac安装 sudo pear install PHP_CodeSniffer phpstorm配置 1. 点击菜单:File->Settings 或 按快捷键 Ctrl+Alt+S ...