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

文章目录

  • 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.rhkb.cn/news/180946.html

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

相关文章

Flink日志采集-ELK可视化实现

一、各组件版本 组件版本Flink1.16.1kafka2.0.0Logstash6.5.4Elasticseach6.3.1Kibana6.3.1 针对按照⽇志⽂件⼤⼩滚动⽣成⽂件的⽅式&#xff0c;可能因为某个错误的问题&#xff0c;需要看好多个⽇志⽂件&#xff0c;还有Flink on Yarn模式提交Flink任务&#xff0c;在任务执…

vSLAM中IMU预积分的作用--以惯性导航的角度分析

作为一个学过一点惯导的工程师&#xff0c;在初次接触视觉slam方向时&#xff0c;最感兴趣的就是IMU预积分了。但为什么要用这个预积分&#xff0c;在看了很多材料和书后&#xff0c;还是感觉模模糊糊&#xff0c;云里雾里。 在接触了vSLAM的更多内容后&#xff0c;站在历史研究…

如何避免 JavaScript 中的内存泄漏?

一、什么是内存泄漏&#xff1f; JavaScript 就是所谓的垃圾回收语言之一&#xff0c;垃圾回收语言通过定期检查哪些先前分配的内存仍然可以从应用程序的其他部分“访问”来帮助开发人员管理内存。垃圾回收语言中泄漏的主要原因是不需要的引用。如果你的 JavaScript 应用程序经…

java中:cmd界面输入javac后提示:找不到或无法加载主类,怎么解决

找不到或无法加载主类 检查环境变量cmd下用 java命令运行文件,提示找不到主类待续、更新中 检查环境变量 CLASSPATH 少写.;安装jdk过程有两部,一步为安装jdk文件夹,全部一致; 另一步为安装jre文件夹与jdk文件夹不一致(或者文件夹安装位置, 一路全部默认)path中将java变量移到顶…

js调整table表格上下相邻元素顺序

有时候我们会遇到要通过箭头控制table表格上下顺序的需求,如下: 点击向下就将该元素下移一位,下面的一位元素就移上来,点击向上就将该元素上移一位,上面的一位元素就移下来,也就是相邻元素互换位置顺序: <el-table :data="targetTable" border style=&quo…

HTTP 协议请求头 If-Match、If-None-Match 和 ETag

概述 在 HTTP 协议中&#xff0c;请求头 If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range 主要是为了解决浏览器缓存数据而定义的请求头标准&#xff0c;按照协议规范正确的判断和使用这几个请求头&#xff0c;可以更精准的处理浏览器缓存&#x…

Springboot3整合Mybatis-plus3.5.3报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

研发效能DevOps: Git安装

目录 一、理论 1.Git 2.Git 工具 二、实验 1.Git安装 2.配置Git 3. VS Code加载Git 一、理论 1.Git &#xff08;1&#xff09;简介 Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照&#xff0c;以此来对整个项目进行版本管理。 Git 是一个…

ASTM F963-23美国玩具安全新标准发布

新标准发布 2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了新版玩具安全标准ASTM F963-23。 主要更新内容 与ASTM F963-17相比&#xff0c;此次更新包括&#xff1a;单独描述了基材重金属元素的豁免情况&#xff0c;更新了邻苯二甲酸酯的管控…

Java与Redis的集成以及Redis中的项目应用

一、Java连接Redis Redis与MySQL都是数据库&#xff0c;java操作redis其实跟操作mysql的过程是一样的。 1.1 导入依赖 打开IDEA&#xff0c;进入Java项目&#xff0c;导入pom依赖&#xff0c;代码如下&#xff1a; <dependency><groupId>redis.clients</gro…

MySQL笔记--Ubuntu安装MySQL并基于C++测试API

目录 1--安装MySQL 2--MySQL连接 3--代码案例 1--安装MySQL # 安装MySQL-Server sudo apt install mysql-server# 设置系统启动时自动开启 sudo systemctl start mysql # sudo systemctl enable mysql# 检查MySQL运行状态 sudo systemctl status mysql# 进入MySQL终端 sudo…

视频剪辑技巧:批量合并视频,高效省时,添加背景音乐提升品质

随着社交媒体的兴起&#xff0c;视频制作越来越受到人们的关注。掌握一些视频剪辑技巧&#xff0c;可以让我们轻松地制作出令人惊艳的视频。本文将介绍一种高效、省时的视频剪辑技巧&#xff0c;帮助您批量合并视频、添加背景音乐&#xff0c;并提升视频品质。现在一起来看看云…

hadoop配置文件自检查(解决常见报错问题,超级详细!)

本篇文章主要的内容就是检查配置文件&#xff0c;还有一些常见的报错问题解决方法&#xff0c;希望能够帮助到大家。 一、以下是大家可能会遇到的常见问题&#xff1a; 1.是否遗漏了前置准备的相关操作配置&#xff1f; 2.是否遗的将文件夹(Hadoop安装文件夹&#xff0c;/dat…

社区牛奶智能售货机为你带来便利与实惠

社区牛奶智能售货机为你带来便利与实惠 低成本&#xff1a;社区牛奶智能货机的最大优势在于成本低廉&#xff0c;租金和人工开支都很少。大部分时间&#xff0c;货柜都是由无人操作来完成销售任务。 购买便利&#xff1a;社区居民只需通过手机扫码支付&#xff0c;支付后即可自…

2023年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 十进制数111转换成二进制数是&#xff1f;&#xff08; &#xff09; A: 111 B: 1111011 C: 101111 D: 1101111 答案…

flink的安装与使用(ubuntu)

组件版本 虚拟机&#xff1a;ubuntu-20.04.6-live-server-amd64.iso flink&#xff1a;flink-1.18.0-bin-scala_2.12.tgz jdk&#xff1a;jdk-8u291-linux-x64.tar flink 下载 1、官网&#xff1a;https://flink.apache.org/downloads/ 2、清华镜像&#xff1a;https://mirr…

【Linux进行时】磁盘文件结构

磁盘 上篇文章&#xff0c;我们提及文件是存放在磁盘当中&#xff0c;本篇文件我们来了解一下磁盘的结构&#xff01;&#xff01;&#xff01; 磁盘的概念&#xff1a; ❓什么是磁盘&#xff1f; &#x1f4a1;磁盘&#xff08;disk&#xff09;是指利用磁记录技术存储数据…

图解系列--理解L3交换机的性能与功能

04.01 何为 L3 交换机 L3交换机是一种在L2 交换机的基础上增加了路由选择功能的网络硬件&#xff0c;能够通过基于ASIC 和 FPGA 的硬件处理高速实现网络功能和转发分组。L2 是指 OSI 参考模型中的L2, 也就是数据链路层。L2 交换机能够基于该层主要编址的 MAC 地址&#xff0c;…

【Linux】:重定向和用户缓冲区

重定向和用户缓冲区 一.输出重定向1.现象2.系统调用接口 二.缓冲区1.引子2.刷新 三.回答引例 文件描述符对应匹配规则&#xff1a;从0下标开始&#xff0c;寻找最小的没有被使用的数组位置&#xff0c;它就是新的文件描述符(fd)。 一.输出重定向 1.现象 在这里我们向1号文件内…

[C++进阶篇]STL中vector的使用

一、vector的介绍 1.vector的介绍 vector是表示可变大小数组的序列容器。vector也采用的连续存储空间来存储元素&#xff0c;就是可以采用下标对vector的元素进行访问&#xff0c;和数组一样。它的大小是可以动态改变的。 2.重要的接口组成 二、 vector迭代器的使用 2.1 ve…