当前位置:首页 > 编程笔记 > 正文
已解决

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 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!