已解决
LeetCode 421. 数组中两个数的最大异或值
来自网友在路上 178878提问 提问时间:2023-11-04 13:50:37阅读次数: 78
最佳答案 问答题库788位专家为你答疑解惑
原题链接:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/?envType=daily-question&envId=2023-11-04
题目分析
异或且时间复杂度在nlogn内第一反应想到字典树,扫一遍存进字典树,然后遍历每个数,
对比当前位数i下,整个数组内是否有某个数的i位上和当前数的i位相异的,如果相异就能取1。高位优先,所以查出来的数会是最大的。
细节上没处理好,过了题但效率偏低
C++代码(字典树)
class Solution {
public:int idx = 0;int son[32*200000+5][2];void insert(string str){int p = 0;//指向树中哪一个节点for(int i=0;i<str.length();i++){int u = str[i]-'0';if(!son[p][u]) son[p][u] = ++idx;p = son[p][u];}}int to_decimal(string str){int res = 0;for(int i=0;i<=31;i++){if(str[i]-'0') res += pow(2,31-i);}return res;}int findMaximumXOR(vector<int>& nums) {int res = 0;memset(son,0,sizeof son);for(auto it:nums){bitset<32> binary(it);insert(binary.to_string());}for(auto it:nums){bitset<32>binary(it);string str = binary.to_string();string temp = "";int len = str.length();int p = 0;for(int i=0;i<len;i++){int x = str[i]-'0';if(!son[p][!x]){//相异不行,只能取相同p = son[p][x];temp += "0";}else{p = son[p][!x];temp += "1";}}res = max(res,to_decimal(temp));}return res;}
};
时间复杂度:O(nlogC) C为数值大小
空间复杂度:O(nlogC)
实际运行出来效率不高,占的空间也比较大
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"LeetCode 421. 数组中两个数的最大异或值":http://eshow365.cn/6-31843-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!