LeetCode 260. 只出现一次的数字 III 中等
题目 - 点击直达
- 1. 260. 只出现一次的数字 III 中等
- 1. 题目详情
- 1. 原题链接
- 2. 题目要求
- 3. 基础框架
- 2. 解题思路
- 1. 思路分析
- 2. 时间复杂度
- 3. 代码实现
1. 260. 只出现一次的数字 III 中等
1. 题目详情
1. 原题链接
LeetCode 260. 只出现一次的数字 III 中等
2. 题目要求
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0,1]
输出:[1,0]
提示:
2 < = n u m s . l e n g t h < = 3 ∗ 104 2 <= nums.length <= 3 * 104 2<=nums.length<=3∗104
− 231 < = n u m s [ i ] < = 231 − 1 -231 <= nums[i] <= 231 - 1 −231<=nums[i]<=231−1
除两个只出现一次的整数外, n u m s nums nums 中的其他数字都出现两次
3. 基础框架
● Cpp代码框架
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {}
};
2. 解题思路
通过异或把数组 n u m s nums nums分成分别只包含一个只出现一次的数的两个部分,分别对这两个部分异或从而分别得到这两个部分的结果 r e t 1 ret1 ret1和 r e t 2 ret2 ret2。
1. 思路分析
( 1 ) (1) (1) 如何把这两个只出现一次的不同的数分隔到不同的两部分呢?
突破点就在于,不同的这两个数是不同的 r e t 1 ret1 ret1和 r e t 2 ret2 ret2,两个整数的不同表现在bit位至少有1位是不同的,而数组中其他数都是出现两次,通过这个不同的bit位既可以把 r e t 1 ret1 ret1和 r e t 2 ret2 ret2分开,也会把 n u m s nums nums中其他的数分开且相同的数一定分在同一组,因为相同的数,bit位一定相同。
( 2 ) (2) (2) 首先对 n u m s nums nums中所有的数进行异或,等价于 r e t 1 ret1 ret1与 r e t 2 ret2 ret2异或,结果保存在 o p t R e t optRet optRet中;
( 3 ) (3) (3) 找到 o p t R e t optRet optRet中一个为1的bit位,把该位置对应的下标记录在 i n d e x B i t indexBit indexBit中;
( 4 ) (4) (4) 遍历 n u m s nums nums数组,根据每一个数的 i n d e x B i t indexBit indexBit位置是0还是1进行分组;
( 5 ) (5) (5) 对于分隔的两组来说,分别对每一组中所有元素进行异或,得到的结果就是这一组中唯一出现的数,记录在 r e t 1 ret1 ret1、 r e t 2 ret2 ret2中;
( 6 ) (6) (6) 返回结果
如何得到具体的某一位bit位?
比如 n u m b e r = 10 number = 10 number=10,二进制 00000000000000000000000000010010 00000000 00000000 00000000 00010010 00000000000000000000000000010010;
得到第5个bit位,期望第5个bit位是1;
(number >> 4) & 1 :使number右移4个bit位,再与1按位与的结果就是第5个bit位的值;
number右移4个bit位: 00000000000000000000000000000001 00000000 00000000 00000000 00000001 00000000000000000000000000000001;
再和1按位与: 00000000000000000000000000000001 00000000 00000000 00000000 00000001 00000000000000000000000000000001;
2. 时间复杂度
O ( N ) O(N) O(N)
第一次遍历 n u m s nums nums数组计算所有数异或的结果;
第二次遍历至多32次找到第一个不相等的bit位下标;
第三次遍历 n u m s nums nums数组把数组分成两部分,同时不同组的数之间进行异或,最终得到两个结果;
这三次遍历先后并列进行, 2 ∗ N + 32 2*N+32 2∗N+32次
3. 代码实现
位运算-异或
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int ret1 = 0, ret2 = 0;// 得到 单独出现的两个不同的数 异或的结果int optRet = 0;for(auto& e : nums){optRet ^= e;}// 找到 tmp中第一个为1的bit位,两个不同的数的该bit位的值一个是1,一个是0// 通过这个bit位,把nums数组的元素可以分成两个部分:// 第一部分,只有一个元素出现一次,其他的元素都出现两次;// 第二部分,只有另一个元素出现一次,另外其他元素的元素都出现两次;// 这样就使得问题简化为分别在两个数组中找到只出现一次的元素了int indexBit = 0;while(indexBit < 32){if(((optRet >> index) & 1) == 1){break;}indexBit++;}// 遍历nums数组,第一部分的元素结果在ret1中// 第二部分的结果记录在ret2中for(auto& e : nums){if(((e >> indexBit) & 1) == 1){ret1 ^= e;}else{ret2 ^= e;}}return vector<int>{ret1, ret2};}
};
哈希映射
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {vector<int> ret;ret.reserve(2);unordered_map<int, int> m;for(auto& e : nums){m[e]++;}for(auto& e : nums){if(m[e] == 1){ret.push_back(e);}}return ret;}
};
T h e The The E n d End End
相关文章:
LeetCode 260. 只出现一次的数字 III 中等
题目 - 点击直达 1. 260. 只出现一次的数字 III 中等1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 260. 只出现一次的数字 III 中等 1. 题目详情 1. 原题链接 LeetCode 260. 只出现一次的数字 III 中等 2. 题目要求 …...

数据结构之红黑树
红黑树的概念 红黑树(Red-Black Tree)同AVL树一样, 也是一种自平衡的二叉搜索树, 但在每个结点上增加一个存储位表示结点的颜色, 可以是Red或Black, 通过对任何一条从根到叶子的路径上各个结点着色方式的限制, 红黑树确保没有一条路径会比其他路径长出俩…...

【chat】4: ubuntu20.04:数据库创建:mysql8 导入5.7表
【chat】3: ubutnu 安装mysql-8 并支持远程访问 已经支持 8.0的SQLyog 远程访问:大神2021年的文章:sql是5.7的版本,我使用的ubuntu20.04,8.0版本:chat数据库设计 C++搭建集群聊天室(七):MySQL数据库配置 及项目工程目录配置 User表,以id 唯一标识 Friend 表,自己的id…...

合并二叉树(Java)
题目描述 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重…...
C语言 exit函数
c语言exit函数的详解_笔记大全_设计学院 (python100.com) “需要注意的是,在程序中使用exit函数会立即强制结束程序,程序内部未处理的任何资源都将不能释放,也就可能导致内存泄漏。因此,在使用exit函数之前,需要先释放…...

基于VPLC711的曲面外观检测XYR运动控制解决方案
市场应用背景 随着消费升级,产品形态正在朝着多样性和精细化方向迅速发展。这导致了对于复杂曲面轨迹加工的需求,包括外观检测、打磨抛光和点胶工艺控制,要求更高的精密度。企业必须主动满足市场需求,不断改进工艺,以…...

【LeetCode刷题-二分查找】--162.寻找峰值
162.寻找峰值 方法一:寻找最大值 题目保证了nums[i]≠nums[i1],所以数组nums中最大值两侧的元素一定严格小于最大值本身,因此最大值所在的位置就是一个可行的峰值位置 class Solution {public int findPeakElement(int[] nums) {int idx 0…...

vscode调试react 最初的源码
如果直接在react项目中打点调试, 调试的是 react-dom.development.js, 而源码里这些逻辑是分散在不同的包里的,如何才能够调试 React 最初的源码呢? JS 代码经过编译,会产生目标代码,但同时也会产生 sourcemap。sourcemap 的作用就是映射目…...
Netty网络通信模型
传统IO模型: 传统IO模型就是阻塞IO,即处理业务逻辑的线程去进行IO,当然IO操作很耗时,然后线程就得阻塞,当然CPU会回收该线程的时间片,把该线程挂起,切换到其他线程去执行,在并发量大…...

.NET快速对接极光消息推送
什么是消息推送? 很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。 常见的一些APP消息推送…...

Doris:多源数据目录(Multi-Catalog)
目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …...

建行驻江门市分行纪检组以政治谈话压责任促发展
开展政治谈话,是加强“一把手”和领导班子监督、严肃党内政治生活、加强对党员领导干部日常教育管理的有效手段。 为督促“一把手”和领导班子成员依法依规履行职责、行使权力,推动党中央重大决策部署以及建设银行总行、广东省分行党委的决策部署在本单…...

如何从存档服务器上完全删除PDM用户
当创建新用户时使用“PDM 登录”类型(如下图),PDM用户名和密码会存储于存档服务器的注册表中。 存档服务器的注册表位置如下: HKEY_LOCAL_MACHINE\SOFTWARE\SolidWorks\Applications\PDMWorks Enterprise\ArchiveServer\ConisioU…...
导师对学生学术论文的指导包括哪些方面,请详细展开说明
导师在指导学生学术论文时涉及多个方面,这些方面旨在帮助学生培养独立研究和学术写作的能力。以下是一些导师可能涉及的主要方面: 1.选题和课题确定: 导师会与学生讨论潜在的研究兴趣和方向,帮助学生选择一个既有研究价值又符合其…...

嵌入式软件开发是个啥职业?
在硬件行业中,有一类工作岗位是更偏向软件的,或者说是软硬结合非常紧密的工作,那就是嵌入式开发工程师。 说起嵌入式,可能很多没有接触过电子类的人没有听说这些东西。 其实简单来说,嵌入式开发就是写程序去控制硬件电…...

03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】
上一篇:02【Git分支的使用、Git回退、还原】 下一篇:【已完结】 目录:【Git系列教程-目录大纲】 文章目录 一、远程协作开发1.1 远程仓库简介1.1.1 Github1.1.2 Gitee1.1.3 其他托管平台 1.2 发布远程仓库1.2.1 创建项目1) 新…...
Linux:centos7通过yum安装mysql的方法
1. 检查mysql是否安装 yum list installed | grep mysql如果有的话,就全部卸载 yum -y remove 数据库名称2. MySQL依赖libaio,所以先要安装libaio yum search libaio # 检索相关信息 yum install libaio # 安装依赖包3. 下载MySQL Yum Repository 如…...

【算法与数据结构】93、LeetCode复原 IP 地址
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参照【算法与数据结构】131、LeetCode分割回文串的思路,需要将IP字符串进行分割࿰…...

uniapp点击图片放大预览
阐述 有些时候我们在用uniapp显示图片时,有的不宜全部显示到屏幕上,uniapp提供了一个非常好用的api。 实现方式如下: <template><view class"content"><image class"logo" src"/static/images/a.…...

Java TreeMap
TreeMap 是一个基于 key 有序的 key value 散列表。 map 根据其键的自然顺序排序,或者根据 map 创建时提供的 Comparator 排序不是线程安全的key 不可以存入null底层是基于红黑树实现的 TreeMap 的类结构图: 实现了 NavigableMap 接口,Na…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...