热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

位运算数组中两个数的最大异或值贪心算法+树或哈希表

贪心规律:二进制下,我们希望一个数尽可能大,即希望越高位上越能够出现“1”,这样这个数就是所求的最大数,这是贪

在这里插入图片描述
贪心规律:二进制下,我们希望一个数尽可能大,即希望越高位上越能够出现“1”,这样这个数就是所求的最大数,这是贪心算法的思想。即我们选择的两个数异或要尽可能让高位为1。

方法一:建立一个深度为32的树,从一个数的第31位开始,如果为0则向左子树走,否则向右子树走。最后将数放在叶节点中。在查找时,根据当前的数字,选择和其搭配使异或值最大的数字。即如果该数的某位为1,则需要选择另一个数该位为0,否则只能选1.

int result &#61; 0;int mask &#61; 0x0;set num_set;for(int i &#61; 31; i >&#61;0; i--){mask &#61; mask | (0x1 <::iterator it &#61; num_set.begin(); it !&#61; num_set.end(); it&#43;&#43;){if(num_set.find(*it ^ tem) !&#61; num_set.end()){ //找到这样的数result &#61; tem;break;}}num_set.clear(); }return result;

方法二&#xff1a;用字典的解法&#xff0c;必须要理解下面的公式&#xff1a;
在这里插入图片描述
在这里插入图片描述
我们利用贪心算法思想&#xff0c;假设我们最大值的尽可能多的高位为1。先假设最大值高位为1&#xff0c;然后取出vector中数据的高位&#xff08;即屏蔽低位后放入set中&#xff09;&#xff0c;如果有1^0这种组合&#xff0c;即可说明该位可以为1。然后看结果的次高位是否能为1。屏蔽vector中的数据的除高2位的位数&#xff0c;加入set中。然后在set中寻找是否有这样的组合使高位和次高位都为1.如果没有&#xff0c;说明次高位只能是0。寻找组合的过程&#xff0c;需要用到开头说的公式&#xff0c;就是当前数异或上待定最大值应该为我们查找的能形成最大值组合的那个数。

struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeNode(int _val): val(_val), left(nullptr), right(nullptr) {}};
public:int findMaximumXOR(vector& nums) {//字典和建树都需要用到贪心算法 //建树 0->left 1->rightTreeNode root(-1); int max &#61; 0;//先进行建树for(auto num : nums){TreeNode* ptr &#61; &root;for(int i &#61; 31; i >&#61; 0; i--){if(num & (0x1 <right &#61;&#61; nullptr){ptr->right &#61; new TreeNode(1);}ptr &#61; ptr->right;}else{if(ptr->left &#61;&#61; nullptr){ptr->left &#61; new TreeNode(0);}ptr &#61; ptr->left;}}ptr->left &#61; new TreeNode(num);}//应用贪心算法&#xff0c;查找当前num下能产生最大异或值得组合for(auto num : nums){TreeNode* ptr &#61; &root;for(int i &#61; 31; i >&#61;0; i--){if(num & (0x1 <left){ptr &#61; ptr->left;}else{ptr &#61; ptr->right;}}else{if(ptr->right){ptr &#61; ptr->right;}else{ptr &#61; ptr->left;}}}if((num^(ptr->left->val)) > max){max &#61; (num^(ptr->left->val));}}return max;}

在这里插入图片描述


推荐阅读
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
author-avatar
生死有命富贵在天999_275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有