【力扣:421,2935】数组内最大异或对问题

思路:从最高位向低位构造,对每一位利用哈希表寻找是否存在可使此位为1的数

第一轮找1:清空哈希表,1,2存1,到3发现1^0=1,res|=1<<3

第二轮找11:清空哈希表,1存10,2存10,3发现11^01=10,res|=1<<3

第三轮找111:清空哈希表,1存101,2存101,3存011...找不到能构造出111的

第四轮找1101:清空哈希表,1存1010,2存1011,到3发现1101^0111=1010,res|=(1<<0)

cpp 复制代码
class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        int res=0,mask=0;
        unordered_set<int>set;
        for(int i=31;i>=0;i--){
            set.clear();
            mask|=1<<i;
            int tmp=res|(1<<i);
            for(int num:nums){
                int x=num&mask;
                if(set.contains(tmp^x)){
                    res=tmp;
                    break;
                }
                set.insert(x);
            }
        }
        return res;
    }
};

在前边基础上加上限制条件即可,对任意强数对满足|x-y|<=min(x,y),假设x比y大那么2*y>=x即可,那么只需要排序后利用unordered_map记录之前的值比较一下即可

cpp 复制代码
class Solution {
public:
    int maximumStrongPairXor(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int res=0,mask=0;
        unordered_map<int,int>map;
        for(int i=31;i>=0;i--){
            map.clear();
            mask|=1<<i;
            int tmp=res|(1<<i);
            for(int j:nums){
                int x=mask&j;
                if(map.count(tmp^x)&&map[tmp^x]*2>=j){
                    res=tmp;
                    break;
                }
                map[x]=j;
            }
        }
        return res;
    }
};
相关推荐
芸忻1 分钟前
day 13 第六章 二叉树 part01代码随想录算法训练营71期
数据结构·算法
2401_900151543 分钟前
C++中的桥接模式
开发语言·c++·算法
自动化和Linux4 分钟前
windows11安装GCC+安装Visual Studio Code,Dev-C++
c++·ide·vscode·编辑器
生活很暖很治愈5 分钟前
Linux——HTTP协议
linux·服务器·c++·网络协议·ubuntu·http
小O的算法实验室15 分钟前
2026年IEEE TNSE SCI2区,基于预测的双阶段分布式任务分配方法+搜救场景中最大化任务分配,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
月流霜18 分钟前
Midjourney 零基础控图七大参数
人工智能·算法·midjourney
知无不研26 分钟前
c++垃圾回收机制
开发语言·c++·智能指针·raii·垃圾回收机制
luckycoding28 分钟前
1487. 保证文件名唯一
数据结构·算法·leetcode
DeeGLMath33 分钟前
从基础算法到机器学习的研究轨迹
人工智能·算法·机器学习
Barkamin37 分钟前
冒泡排序的简单实现
java·算法·排序算法