1. 题目

给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231

找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ≤ i, j < n 。

你能在O(n)的时间解决这个问题吗?

示例:输入: [3, 10, 5, 25, 2, 8]输出: 28解释: 最大的结果是 5 ^ 25 = 28.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. Tries树

  • 题目要求O(n)时间复杂度,两两异或O(n2)
  • 考虑将每个数字的二进制位插入Trie树(从高位往低位插入)O(n)
  • 再遍历每个数字bit,贪心从trie树的异或最大路径往下走,得到一个val,取val的最大值,O(n)时间复杂度
class Node
{public:int val;Node *next[2];Node(int v = 0):val(v) {next[0] = next[1] = NULL;}
};
class Trie
{public:Node *root;Trie(){root = new Node();}~Trie()//析构释放内存{destroy(root);}void destroy(Node *root){if(root == NULL)return;destroy(root->next[0]);destroy(root->next[1]);delete root;}void insert(int n)//插入数字的二进制位{Node *cur = root;int bit;for(int i = 31; i >= 0; --i){bit = (n>>i) & 1;if(cur->next[bit] == NULL)cur->next[bit] = new Node(bit);cur = cur->next[bit];}}int MaxXOR(int n){Node *cur = root;int val = 0, bit, anotherBit;for(int i = 31; i >= 0; --i){bit = (n>>i) & 1;anotherBit = bit^1;//取反if(cur->next[anotherBit]){val += (1<<i);cur = cur->next[anotherBit];}elsecur = cur->next[bit];}return val;}
};
class Solution {public:int findMaximumXOR(vector<int>& nums) {Trie tree;int ans = INT_MIN;for(int n:nums)tree.insert(n);for(int n:nums)ans = max(ans,tree.MaxXOR(n)); return ans;}
};

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

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

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

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

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

  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. Python源码学习:Python函数浅析-无参函数
  2. 一张图看懂微软人工智能
  3. 解读 2018 之运维篇:我们离高效智能的运维还有多远
  4. centos7升级python到3_CentOS7 升级Python2.x到3.x
  5. wordpress插入腾讯视频的方法
  6. webrtc一对一通话
  7. 模式识别与机器学习笔记(二)机器学习的基础理论
  8. Citrix Netscaler版本管理和选择
  9. 作者:汪疆平(1970-),男,北明软件有限公司技术研究院高级工程师、副院长。...
  10. ui kit模板的用途是什么?
  11. Spring 相关jar包下载及其地址(官方下载地址 )
  12. 33.卷1(套接字联网API)---调试技术
  13. IT管理到底是做什么
  14. 面试技巧之面试官常提的问题
  15. 高级软件工程第七次作业:LLS战队Alpha敏捷冲刺5
  16. 高能所客座用户计算机申请,2020年中科院高能所招收联合培养硕士博士生、客座研究生多名...
  17. 【9】前端实习:react audio播放音乐组件(详细完整代码)
  18. 核桃编程学员对话诺贝尔奖得主 用童心预见未来 探讨人工智能发展
  19. 彻底解决“你的时钟快了”问题
  20. 编包----rpm和deb和ISO目录制作出ISO

热门文章

  1. 线程的控制(创建、等待、终止)、分离线程
  2. CodeForces - 540D Bad Luck Island —— 求概率
  3. bzoj4639 博士的选取器
  4. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
  5. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -
  6. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q40-Q44)
  7. unzipped list
  8. 有效创建Oracle dblink的两种方式
  9. Redis pub/sub机制在实际运用场景的理解(转载)
  10. 双一流大学毕业的我,应该何去何从?