当前位置: 首页 > news >正文

421. 数组中两个数的最大异或值/字典树【leetcode】

421. 数组中两个数的最大异或值

给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。

示例 1:
输入:nums = [3,10,5,25,2,8]
输出:28
解释:最大运算结果是 5 XOR 25 = 28.

示例 2:
输入:nums = [14,70,53,83,49,91,36,80,92,51,66,70]
输出:127

提示:
1 <= nums.length <= 2 * 105
0 <= nums[i] <= 2的31次方 - 1

字典树

思路:可以将每个数变成最高31位的二进制数,建立字典树,为使异或值最大,应该尽可能找不一样的,如果该位为0先找1,该位为1先找0

class Solution {
public://记录某个id下下个数为0或者1的idint a[200005*31][2];//记录某个id代表的十进制数 是唯一的int cnt[200005*31];//按顺序赋予id,代表树的一个节点int id=0;int findMaximumXOR(vector<int>& nums) {for(int i=0;i<nums.size();i++){insert(nums[i]);}int res=0;for(int i=0;i<nums.size();i++){res = max(res,find(nums[i]));}return res;}//建树void insert(int b){int p=0;for(int i=30;i>=0;i--){int x=(b>>i)&1;//获得第i位的值if(a[p][x]==0) a[p][x]=++id;//新建节点p=a[p][x];}cnt[p]=b;//记录该节点的十进制数}//找树中和b异或的最大值int find(int b){int p=0;int big=0;for(int i=30;i>=0;i--){int x=(b>>i)&1;if(x==1){if(a[p][0]!=0) p=a[p][0];else if(a[p][1]!=0) p=a[p][1];}if(x==0){if(a[p][1]!=0) p=a[p][1];else if(a[p][0]!=0) p=a[p][0];}}big=max(big,b^cnt[p]);return big;}
};
http://www.lryc.cn/news/227092.html

相关文章:

  • C++(20):自定义类型实现基于范围的for循环
  • Linux常用命令:find、grep、vim、cat、less、more
  • Oracle导入,注意事项
  • 【数据结构】入队序列出队序列问题(以21年408真题举例)
  • 在ant构建脚本中调用maven的命令
  • 美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证
  • Git基础知识学习常用命令一
  • 【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用
  • 云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元
  • [护网杯 2018]easy_tornado 1(两种解法!)
  • 冒泡排序(Bubble Sort)
  • JVM源码剖析之软、弱、虚引用的处理细节
  • Linux服务器上搭建JupyterNotebook教程
  • 记录bug1
  • 【MySQL】rank()、row_number()、dense_rank()用法详解
  • NFT合约部署
  • 【C++】从入门到精通第三弹——友元函数与静态类成员
  • acwing算法基础之搜索与图论--floyd算法
  • Zabbix监控SSL证书有效期
  • Arduino OneButton按键处理库实现单击/双击/长按功能
  • day52 django的下载与安装
  • WebGL智慧城市软件项目
  • VMware重装后没有虚拟网卡
  • 软件安全基础
  • 探索项目管理软件的多重用途和益处
  • Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
  • 【车载开发系列】AutoSar中的CANTP
  • JUL日志
  • ZZ308 物联网应用与服务赛题第G套
  • 如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?