LeetCode 421. 数组中两个数的最大异或值(Trie树)
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树)相关推荐
- LeetCode 421. 数组中两个数的最大异或值
421. 数组中两个数的最大异或值 Idea 假设选择了数组中的元素ai和aj使得它们达到最大按位异或结果x:x=ai⊕ajx=a_{i}⊕a_{j}x=ai⊕aj,其中⊕表示按位异或运算. 根据 ...
- Leetcode :421. 数组中两个数的最大异或值 (位运算)
421. 数组中两个数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, - , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算 ...
- 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] ...
最新文章
- Python源码学习:Python函数浅析-无参函数
- 一张图看懂微软人工智能
- 解读 2018 之运维篇:我们离高效智能的运维还有多远
- centos7升级python到3_CentOS7 升级Python2.x到3.x
- wordpress插入腾讯视频的方法
- webrtc一对一通话
- 模式识别与机器学习笔记(二)机器学习的基础理论
- Citrix Netscaler版本管理和选择
- 作者:汪疆平(1970-),男,北明软件有限公司技术研究院高级工程师、副院长。...
- ui kit模板的用途是什么?
- Spring 相关jar包下载及其地址(官方下载地址 )
- 33.卷1(套接字联网API)---调试技术
- IT管理到底是做什么
- 面试技巧之面试官常提的问题
- 高级软件工程第七次作业:LLS战队Alpha敏捷冲刺5
- 高能所客座用户计算机申请,2020年中科院高能所招收联合培养硕士博士生、客座研究生多名...
- 【9】前端实习:react audio播放音乐组件(详细完整代码)
- 核桃编程学员对话诺贝尔奖得主 用童心预见未来 探讨人工智能发展
- 彻底解决“你的时钟快了”问题
- 编包----rpm和deb和ISO目录制作出ISO
热门文章
- 线程的控制(创建、等待、终止)、分离线程
- CodeForces - 540D Bad Luck Island —— 求概率
- bzoj4639 博士的选取器
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
- SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q40-Q44)
- unzipped list
- 有效创建Oracle dblink的两种方式
- Redis pub/sub机制在实际运用场景的理解(转载)
- 双一流大学毕业的我,应该何去何从?