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

文章目录

  • 刷题前唠嗑
  • 题目:数组中两个数的最大异或值
    • 题目描述
    • 代码与解题思路
  • 结语

刷题前唠嗑


LeetCode? 启动!!!

题目:数组中两个数的最大异或值

题目链接:421. 数组中两个数的最大异或值

题目描述

代码与解题思路

func findMaximumXOR(nums []int) (ans int) {for i := 0; i < len(nums); i++ {for j := i+1; j < len(nums); j++ {ans = max(ans, nums[i]^nums[j])}}return ans
}func max(a, b int) int {if a > b {return a}return b
}

一眼顶真,鉴定为暴力出奇迹,暴力?启动!

暴力启动失败。。。(不应该啊,绝对是 LeetCode 更新了样例,10 的 5 次方的复杂度应该是可以暴力过的)

没关系,我其实还有一个思路,就是他想要最大值,我们可以找二进制最高位是能取到 1 的值,然后次高位,以此类推,就能找到最大的异或值。想的很好,但是我不知道咋写,没办法,偷看大佬题解去了

看了少说半个小时的题解,终于有点眉目了,算法菜鸟落泪了

func findMaximumXOR(nums []int) (ans int) {mask := 0for i := 30; i >= 0; i-- { // 从最高位开始判断mp := map[int]bool{} mask |= 1 << i // 把第 i 位, 置为 1checkAns := ans | 1 << i // 将 checkAns的 第 i 位, 置为 1for _, v := range nums { // 遍历 nums 数组v &= mask // i 位之后全置为 0if mp[checkAns^v] { // 如果存在两个数异或等于 checkAns ans = checkAns // checkAns 成真,更新 ansbreak}mp[v] = true // 将 v 塞进 map}}return ans
}

虽然打了很多注释,但不够清楚,我来整体捋一下这道题的思路:

  1. 从最高位开始判断(这个很好理解,毕竟是求最大)
  2. 理解 checkAns 变量:每次遍历,我们会将 ans 的第 i 位设置成 1,也就是理想中的最大值,接下来的逻辑就是看看 nums 数组中的数进行异或操作能不能得到 i 位为 1 的 checkAns,如果能,就更新 ans,如果不能就继续遍历
  3. 理解 mask 变量:mask 将第 i 位之后的值都置为 0,只关注第 i 位及以前的值(具体来说就是这个操作:v &= mask),当 nums 数组中出现一个 v,能让 v^checkAns = map 中的任意一个 v,就证明数组中的两个值异或能得出 checkAns,所以就能更新 ans 的大小了
  4. 理解为什么使用 map:使用 map 之后,原本是 O(N) 的匹配,就优化成了 O(1) 的匹配效率,这就是为什么时间复杂度下降的原因

最后补充一下位运算的一个小知识:
a ^ b = c
b ^ b = 0
可得:a = c ^ b

带入题目中:
v ^ (map 中的任意一个 v) = checkAns
v ^ v = 0
(map 中的任意一个 v) = v ^ checkAns

结语

我燃尽了。。。

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

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

相关文章

python问题笔记2

70 列表嵌套元组,分别按字母和数字排序 您可以使用Python中的sorted()函数来对列表中的元组进行排序。首先,您需要定义一个自定义的排序函数,以便根据字母或数字进行排序。 以下是一个例子,展示如何按字母和数字分别对嵌套元组进行排序: def sort_by_letter(item):retu…

前端埋点方式

前言&#xff1a; 想要了解用户在系统中所做的操作&#xff0c;从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助&#xff0c;想实现这种需求可以通过前端埋点的方式。 埋点方式&#xff1a; 1.什么是埋点&#xff1f…

基于Jenkins实现接口自动化持续集成,学完涨薪5k

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程&#xff1a;https://blog.csdn.net/YZL40514131/article/details/131504280 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建…

【python】路径管理+路径拼接问题

路径管理 问题相对路径问题绝对路径问题 解决os库pathlib库最终解决 问题 环境&#xff1a;python3.7.16 win10 相对路径问题 因为python的执行特殊性&#xff0c;使用相对路径时&#xff0c;在不同路径下用python指令会有不同的索引效果&#xff08;python的项目根目录根据执…

Temp directory ‘C:\WINDOWS\TEMP‘ does not exist

问题描述 解决方法 管理员权限问题&#xff0c;进入temp文件夹更改访问权限即可。 点击 temp文件夹 属性 -> 安全 -> 高级 -> 更改主体Users权限 给读取和写入权限 参考博客 开发springboot项目时无法启动Temp directory ‘C: \WINDOWS\TEMP‘ does not exist

git本地项目同时推送提交到github和gitee同步

git本地项目同时推送提交到github和gitee同步 同时推送到GitHub和Gitee&#xff08;码云&#xff09;可以通过设置多个远程仓库地址来实现。具体步骤如下&#xff1a; 一、分别推送 # 初始化仓库 git init# 添加远程仓库 git remote add gitee gitgitee.com:bealei/test.git…

C 保留字解释

语句 // 单行注释 /* */ 多行注释 #include 头文件引入声明 #define 预先定义 return 结果返回语句&#xff08;可以带参数&#xff0c;也可不带参数&#xff09; printf(); 输出 if 条件语句 else 条件语句否定分支&#xff08;和 if 连用&a…

5.2 向线程传递参数

pthread_create()允许编程人员向线程的执行方法中传入一个参数&#xff0c;对于需要传递多个参数的情况&#xff0c;可以将这些参数封装到一个结构体中&#xff0c;然后将结构体对象的指针作为参数进行传入。传入的参数必须为(void *)类型。 问题&#xff1a;考虑到线程启动和调…

Python库学习(十二):数据分析Pandas[下篇]

接着上篇《Python库学习(十一):数据分析Pandas[上篇]》,继续学习Pandas 1.数据过滤 在数据处理中&#xff0c;我们经常会对数据进行过滤&#xff0c;为此Pandas中提供mask()和where()两个函数&#xff1b; mask(): 在 满足条件的情况下替换数据&#xff0c;而不满足条件的部分…

leetcode-经典面/笔试题目

1.消失的数字 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/missing-number-lcci/ 这个题目当然有好几种解法&#xff0c;这里我推荐一种比较优秀的思路&#xff0c;也就是单身狗思路&#xff1a;异或。 异或的特点是相异…

账户权限控制

1.首先配置一个单群组4节点的链 1.1创建操作目录 cd ~ && mkdir -p fisco && cd fisco 1.2下载国内脚本 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod ux bu…

【KVM】软件虚拟化和硬件虚拟化类型

前言 大家好&#xff0c;我是秋意零。 今天介绍的内容是虚拟化技术以及软件虚拟化和硬件虚拟化。 &#x1f47f; 简介 &#x1f3e0; 个人主页&#xff1a; 秋意零&#x1f525; 账号&#xff1a;全平台同名&#xff0c; 秋意零 账号创作者、 云社区 创建者&#x1f9d1; 个…

Linux 之搭建 arm 的 qemu 模拟器

目录 1. Linux 之搭建 arm 的 qemu 模拟器 1. Linux 之搭建 arm 的 qemu 模拟器 OS: kali 1. 安装交叉编译工具、GDB 和 QEMU # sudo apt-get install qemu debootstrap qemu-user-static # sudo apt-get install qemu-system-arm # sudo apt-get install gdb-multiarch //支持…

系统提示缺少或找不到d3dcompiler_43.dll文件的详细修复教程

今天我来给大家分享一下关于d3dcompiler_43.dll缺失的4个修复方法。 首先&#xff0c;我们来了解一下d3dcompiler_43.dll的作用。它是DirectX中的一个组件&#xff0c;用于编译Shader和Pixel着色器代码。如果缺少了这个文件&#xff0c;就会导致游戏或应用程序无法正常运行。 …

全能数据分析软件 Tableau Desktop 2019 mac中文版功能亮点

Tableau Desktop 2019 mac是一款专业的全能数据分析工具&#xff0c;可以让用户将海量数据导入并记性汇总&#xff0c;并且支持多种数据类型&#xff0c;比如像是编程常用的键值对、哈希MAP、JSON类型数据等&#xff0c;因此用户可以将很多常用数据库文件直接导入Tableau Deskt…

适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

文章目录 内容简介读者对象专家推荐目录赠书活动 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 线下CTF比赛培训中存在…

Docker / OSX快速入门

Docker / OSX快速入门 目录 Docker / OSX快速入门 在Mac上安装 Boot2Docker 关于容器的一个注意事项 一个例子&#xff1a;Python Flask App 运行 在AWS上运行相同的容器 更多东西 本文章向大家介绍Docker / OSX快速入门&#xff0c;主要内容包括在Mac上安装、Boot2Do…

C++11范围for

在C98中&#xff0c;不同的STL容器和C风格数组的遍历方式各不相同&#xff0c;写法也不统一&#xff0c;而且不够简洁。而C11基于范围的for循环可以简洁并且统一的方式遍历STL容器和C风格数组。 在介绍for循环新的语法之前&#xff0c;简单来看一下for循环之前遍历STL容器的例…

力扣:149. 直线上最多的点数(Python3)

题目&#xff1a; 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱…

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道&#xff0c;可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…