【每日一题】数组中两个数的最大异或值

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:哈希集合
  • 其他语言
    • python3
  • 写在最后

Tag

【哈希集合】【位运算-异或和】【数组】【2023-11-04】


题目来源

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


题目解读

找出数组中两个数的最大异或结果。


解题思路

一看数据量达到了 1 0 5 10^5 105,那时间复杂度为 O ( n 2 ) O(n^2) O(n2) 的方法必定超时,因此需要去找 O ( n l o g n ) O(nlogn) O(nlogn) 或者 O ( n ) O(n) O(n) 时间复杂度的方法。

对于本题,最直白的想法是枚举数组中的两个数,计算异或值,找出最大值返回即可,但是该方法的需要两次枚举数,属于嵌套循环,时间复杂度为 O ( n 2 ) O(n^2) O(n2),一定超时,故需要考虑其他方法。

接下来将介绍两种方法来解决本题:

  • 哈希集合;
  • 字典树(待完成…)。

方法一:哈希集合

以下思路与代码主要参考 【图解】简洁高效,一图秒懂!(Python/Java/C++/Go/JS/Rust)。

为了得到最大的异或和数,简称为 结果,我们希望 结果 的二进制数从高位到低位尽可能出现更多的 1。为什么对二进制数进行判断?因为,位运算都是二进制位之间的运算(异或和、按位与等等),我们对二进制数进行判断会更加接近底层运算(异或和、按位与等等)。

跳出从数组中直接找数的固化思维,根据 结果 的特征,我们从最高位到最低位来找数。最高位也就是数组中最大数的二进制数长度减一,我们从该位开始枚举 i

  • 当前需要找的结果是 newAns = res | (1 << i),也就是从数组中找到两个数(低于 i 的比特位为 0)满足这两个数的异或和等于 newAns,如果有,则更新 res = newAns,否则 res 不变;
  • 判断两个数的异或和的解题思想是 两数之和 哈希表解法。把代码中的减法改成异或就行,这是因为如果 a ⊕ b = n e w A n s a\oplus b = newAns ab=newAns,那么两边同时异或 b,由于 b ⊕ b = 0 b\oplus b = 0 bb=0,所以得到 a = n e w A n s ⊕ b a = newAns \oplus b a=newAnsb。这样就可以一边枚举 b,一边在哈希表中查找 n e w A n s ⊕ b newAns \oplus b newAnsb 了。

实现代码

class Solution {
public:int findMaximumXOR(vector<int>& nums) {int mx = *max_element(nums.begin(), nums.end());int high_bit = mx ? 31 - __builtin_clz(mx) : -1;int res = 0, mask = 0;unordered_set<int> seen;for (int i = high_bit; i >= 0; --i) {seen.clear();mask |= (1 << i);int new_ans = res | (1 << i);for (int x : nums) {x &= mask;if (seen.contains(new_ans ^ x)) {res = new_ans;break;}seen.insert(x);}}return res;}
};

复杂度分析

时间复杂度: O ( n l o g U ) O(nlogU) O(nlogU) n n n 是数组 nums 的长度, U U U 是数组中最大元素的位数。

空间复杂度: O ( n ) O(n) O(n),哈希表中至多存放 n 个数。


其他语言

python3

class Solution:def findMaximumXOR(self, nums: List[int]) -> int:ans = mask = 0high_bit = max(nums).bit_length() - 1for i in range(high_bit, -1, -1):  # 从最高位开始枚举mask |= 1 << inew_ans = ans | (1 << i)  # 这个比特位可以是 1 吗?seen = set()for x in nums:x &= mask  # 低于 i 的比特位置为 0if new_ans ^ x in seen:ans = new_ans  # 这个比特位可以是 1breakseen.add(x)return ans

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04搭建RISC-V和qemu环境

1. 前言 risc-v是一个非常有潜力的指令集框架&#xff0c;最近对其产生了浓厚的兴趣&#xff0c;由于之前对于这方面的知识储备很少&#xff0c;在加上网上的教程都是点到为止&#xff0c;所以安装过程异常曲折。好在最后一步一步积累摸索&#xff0c;终于利用源码安装完成。看…

【中国知名企业高管团队】系列59:TCL

今天华研荟为大家介绍TCL公司的情况和创始人李东生先生的故事。 一、关于TCL TCL创立于1981年&#xff0c;前身为中国首批13家合资企业之一&#xff1a;TTK家庭电器(惠州)有限公司&#xff0c;该公司为中港合资企业&#xff0c;最初从事卡式录音磁带的生产制造&#xff0c;19…

基于单片机的超声波测距仪

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、本课题研究的主要内容二、超声波测距仪的整体方案2.2 超声波测距仪设计原理 三、超声波测距仪系统硬件电路的设计3.1 超声波测距仪的基本结构 四、 超声波测距仪系统的软件设计4.1 主程序软件设计仿真 五、结…

2019数二(二重积分的不等式问题)

注&#xff1a; 1、在相同积分区域内的积分比较大小&#xff1a;被积函数大的积分值大&#xff0c;被积函数小的积分值小 2、在区间[0&#xff0c;Π/2]上 &#xff1a;sinx < x < tanx

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

C语言查看各数据类型所占大小

编译器&#xff1a;VC2010 #include<stdio.h> int main() {printf("%d\n",sizeof(char));printf("%d\n",sizeof(short));printf("%d\n",sizeof(int));printf("%d\n",sizeof(long));printf("%d\n",sizeof(long long))…

【sql注入】sql关卡1~4

前言&#xff1a; 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…

最新 vie-vite框架下 jtopo安装使用

官方地址 官方源码 安装下载 1.官方好像都没有给git地址&#xff0c;尝试npm安装报错 2.找到1.0.5之前的版本npm i jtopo2&#xff0c;安装成功后使用报错&#xff0c;应该是版本冲突了 1.本地引入&#xff0c; 点击官方源码下载&#xff0c;需要jtopo_npm文件 2.引入到本…

Jetpack:030-Jetpack中的状态

文章目录 1. 概念介绍2. 使用方法2.1 可监听对象2.2 获取状态值2.3 修改状态值2.4 重组函数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中网格布局相关的内容&#xff0c;本章回中主要 介绍状态。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff0…

【SpringCloud Alibaba -- Nacos】Linux 搭建 Nacos 集群

搭建 Nacos 集群 架构 centos安装docker https://docs.docker.com/engine/install/centos/ 详细配置过程 MySql8 mysql数据库配置 数据库脚本 nacos/conf/nacos-mysql.sql Nacos2 application.properties 修改为mysql spring.datasource.platformmysqldb.num1 db.url…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求&#xff1a; 1&#xff09;被要求统计代码行数&#xff1b; 2&#xff09;不想打开Linux&#xff0c;懒得下载Windows版本GitStats&#xff1b; 3&#xff09;打开了Linux但也不记得find命令行怎么用&#xff1b; 4&#xff09;打开了Linux&#xff0c;装好了Gitstats但自…

wagtail的使用

文章目录 安装虚拟环境新建项目时指定虚拟环境打开已有项目添加虚拟环境 安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 管理工作台内容扩展首页的数据模型更新数据库修改模板页创建一个页面的过程 models中的基本字段templates字符型文本字段富…

汽车标定技术(四)--问题分析:多周期测量时上位机显示异常

目录 1.问题现象 2.数据流分析 ​​​​3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时&#xff0c; DAQ的实现是一大头痛的事情。最初单周期实现还好一点&#xff0c;特别是…

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

系列文章目录 文章目录 系列文章目录前言一、设置 Gazebo 仿真环境二、在 Gazebo 中模拟和控制机器人2.1 概述2.2 任务调度器2.3 感知和目标生成系统2.4 运动规划2.5 机械臂和关节控制系统 三、分配用于控制机器人的参数3.1 定义机器人模型和运动规划参数&#xff0c;3.2 定义机…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承&#xff0c;这与现实生活中的继承意思差不…

[直播自学]-[汇川easy320]搞起来(1)给PLC供电

从没正儿八经的用一用PLC&#xff0c;所以双11在淘宝入手一个EASY320&#xff0c;大概1000出头。 到货后&#xff0c;汇川官网搜了一下资料&#xff0c;搜到这几个&#xff1a; 首先是给PLC供电吧&#xff0c;看了下PLC前面是24V&#xff0c;不知道供电范围多宽&#xff0c;于…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…

https原理

首先说一下几个概念&#xff1a;对称加密、非对称加密 对称加密&#xff1a; 客户端和服务端使用同一个秘钥&#xff0c;分两种情况&#xff1a; 1、所有的客户端和服务端使用同一个秘钥&#xff0c;这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…