这题要求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. newcoder Tachibana Kanade Loves Probability(小数点后第k位)题解

    题意:题目链接立华奏在学习初中数学的时候遇到了这样一道大水题: “设箱子内有 n 个球,其中给 m 个球打上标记,设一次摸球摸到每一个球的概率均等,求一次摸球摸到打标记的球的概率” “emmm...语 ...

  2. codeforce 955c --Sad powers 思路+二分查找

    这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...

  3. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  4. python获取当前文件路径以及父文件路径

    #当前文件的路径 pwd = os.getcwd() #当前文件的父路径 father_path=os.path.abspath(os.path.dirname(pwd)+os.path.sep+&q ...

  5. SpringBoot 配置阿里巴巴Druid连接池

    在Spring Boot下默认提供了若干种可用的连接池(dbcp,dbcp2, tomcat, hikari),当然并不支持Druid,Druid来自于阿里系的一个开源连接池,它提供了非常优秀的监控功 ...

  6. 『TensorFlow』张量拼接_调整维度_切片

    1.tf.concat tf.concat的作用主要是将向量按指定维连起来,其余维度不变:而1.0版本以后,函数的用法变成: t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, ...

  7. Petrozavodsk Winter Camp, Andrew, 2014, Dichromatic Trees

    条件: 1:每个红色节点的儿子都是黑色节点 2.每个叶子到根路径上的黑点数相等,等于某个常数,称作树的black height 求给定black height和节点数的符合条件的方案数 $black_ ...

  8. 数组和List以指定的方式拼接成字符串类型

    /// <summary> /// list转换成格式的字符串 /// </summary> /// <param name="param">拼 ...

  9. [poj P2411] Mondriaan's Dream

    [poj P2411] Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18023   A ...

  10. 【协议逆向工程】Part 1 概述

    1 协议逆向工程概述 1.1 协议 协议是计算机网络与分布式系统中各种通信实体键相互交互信息时必须遵守的一组规则和约定,这些规则明确规定了所交换的数据格式以及有段的同步问题,从而保证了双方通信有条不紊 ...