算法笔记-lc-面试题 17.19. 消失的两个数字(困难)

机器学习实操避坑指南:从数据清洗到本地部署的端到端闭环 机器学习入门的核心不在数学推导,而在构建可运行、可验证、可交付的端到端闭环。理解特征工程与模型训练的协同关系,掌握pandas数据清洗、scikit-learn快速建模、TimeSeriesSplit防数据泄漏等关键技术,是避免‘学不会’假象的关键。其技术价值在于将业务问题(如销量预测、邮件分类)转化为可调试的代码逻辑,支撑非技术岗快速验证AI可行性,助力应届生跨越面试与落地的鸿沟,并为技术负责人提供可复现的最小可行原型。本文聚焦真实项目中的高频痛点:环境配置冲突、时间特征泄露、中文路径报错、标准化误用等, 阅读详情

@[TOC](算法笔记-lc-面试题 17.19. 消失的两个数字(困难))

题目

题干

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例

示例 1:

输入: [1]
输出: [2,3]
示例 2:

输入: [2,3]
输出: [1,4]

提示:

nums.length <= 30000

题解

如果本题不要求时间复杂度和空间复杂度的话,可以使用排序(标记数组)或哈希表,其中排序的时间复杂度可以达到O(n)(计数排序相当于标记数组)-O(nlogn)(快速排序),哈希表的时间复杂度与标记数组相同都为O(n),这几种未优化的算法空间复杂度均为O(n)

方法一:位运算

思路与算法

寻找消失的数字,最直观的方法是使用哈希表存储数组中出现过的数字。由于这道题有时间复杂度 O(n) 和空间复杂度 O(1) 的要求,因此不能使用哈希表求解,必须使用其他方法。利用位运算的性质,可以达到时间复杂度 O(n) 和空间复杂度 O(1)。

由于从 1 到 n 的整数中有两个整数消失,其余每个整数都在数组中出现一次,因此数组的长度是 n−2。在数组中的 n−2 个数后面添加从 1 到 n 的每个整数各一次,则得到 2n−2 个数字,其中两个在数组中消失的数字各出现一次,其余每个数字各出现两次。

假设数组 nums 中消失的两个数字分别是 x1​和 x2 。如果把上述 2n−2 个数字全部异或起来,得到结果 x,那么一定有:
x=x1⊕x2其中⊕ 表示异或运算。这是因为nums 中出现两次的元素都会因为异或运算的性质 a⊕b⊕b=a 抵消掉,那么最终的结果就只剩下 x1 和 x2的异或和。
显然x! =0,因为如果 x=0,那么说明 x1 =x2​,这样x1和 x2就不是在上述 2n−2 个数字中只出现一次的数字了。因此,我们可以使用位运算 x & -x 取出 x 的二进制表示中最低位那个 1,设其为第 l 位,那么x1和 x2 中的某一个数的二进制表示的第 l 位为 0,另一个数的二进制表示的第 l 位为 1。在这种情况下,x1⊕x2的二进制表示的第 l 位才能为 1。
这样一来,我们就可以把从 11 到 nn 的所有整数分成两类,其中一类包含所有二进制表示的第 l 位为 0 的数,另一类包含所有二进制表示的第 l 位为 1 的数。可以发现:
对于任意一个在数组nums 中出现一次的数字,这些数字在上述 2n−2 个数字中出现两次,两次出现会被包含在同一类中;对于任意一个在数组nums 中消失的数字,即 x1和 x2 ,这些数字在上述 2n - 22n−2 个数字中出现一次,会被包含在不同类中。
因此,如果我们将每一类的元素全部异或起来,那么其中一类会得到 x1,另一类会得到 x2。这样我们就找出了这两个只出现一次的元素。

代码

class Solution {
    public int[] missingTwo(int[] nums) {
        int xorsum = 0;
        int n = nums.length + 2;
        for (int num : nums) {
            xorsum ^= num;
        }
        for (int i = 1; i <= n; i++) {
            xorsum ^= i;
        }
        // 防止溢出
        int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));
        int type1 = 0, type2 = 0;
        for (int num : nums) {
            if ((num & lsb) != 0) {
                type1 ^= num;
            } else {
                type2 ^= num;
            }
        }
        for (int i = 1; i <= n; i++) {
            if ((i & lsb) != 0) {
                type1 ^= i;
            } else {
                type2 ^= i;
            }
        }
        return new int[]{type1, type2};
    }
}

复杂度分析

时间复杂度:O(n),其中 n 是最大的整数。需要遍历的数字有 2n−2 个,共遍历两次。

空间复杂度:O(1)。

方法二:解方程

我们记缺的两数为x、y,首先我们计算出n数的和以及实际和,差值即为a = x + y; 然后我们计算出n数的平方和与实际和,差值即为b = x * x + y * y。联立得到一元二次方程,不难得出两根分别为(a (±) sqrt(2 * b - a * a)) / 2。

class Solution {
	public int[] missingTwo(int[] nums) {
        long n = nums.size() + 2;
        int a = -accumulate(nums.cbegin(), nums.cend(), -(1 + n) * n / 2);
        int b = -inner_product(nums.cbegin(), nums.cend(), nums.cbegin(), -(1 + n) * n / 2 * (2 * n + 1) / 3);
        int tmp = Math.pow(2 * b - a * a,2);
        return { (a + tmp) / 2, (a - tmp) / 2 };
    }
}

方法三:数学

根据题意,给定 nums 的长度为 m 且缺失了两个数,所有的 nums[i] 加上缺失数字组成连续排列长度为 n=m+2。

根据等差数量求和公式可知,补齐后的排列总和为2n×(1+n),补全后的理论总和与实际总和之间的差值cur= 2n×(1+n)−
∑ i=0
m−1
​ nums[i] 为缺失数值之和。

根据补全后数值各不相同可知,两者必不可能同时位于t=2/cur的同一侧或共点(偏大、偏小或数值重复),因此我们可以计算 [1,t] 范围内的理论总和与实际总和之间的差值来确定其一(将问题转换为求解缺失一值),再结合缺失两值之和 sum 算得答案。

代码:

class Solution {
    /**解题思路:
     * 宫水三叶题解---数学
     */
    public int[] missingTwo(int[] nums) {
        int n = nums.length + 2;  //数组原本的长度
        int cur = n * (1 + n) / 2;  //数组原本的总和,根据等差数列求和公式得出
        for (int x : nums) cur -= x;  //cur为缺失的两个数的和
        int sum = cur;
        int t = cur / 2;  //t为缺失的两个数的和的一半
        cur = t * (1 + t) / 2;  //求数组[1, t]的理论总和
        for (int x : nums) {  //求数组[1, t]的实际总和,理论与实际之差即缺失两数之一
            if (x <= t) cur -= x;
        }
        return new int[]{cur, sum - cur};
    }
}

时间复杂度:O(n)
空间复杂度:O(1)

YOLOv11【第八章:遥感与无人机航拍篇·第6节】SAHI(Slicing Aided Hyper Inference):切片辅助推理提升小目标召回率! 🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。 阅读详情

相关推荐

在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合

本文介绍了在Mac上搭建本地AI工作流的方法,结合Dify平台和DeepSeek模型。Dify是一个开源的大语言模型应用开发平台,支持可视化AI应用开发。部署步骤包括:1)安装Homebrew和Docker;2)克隆Dify代码库;3)配置环境变量并启动服务。同时,使用Ollama工具本地部署DeepSeek模型,将其集成到Dify中创建聊天助手。通过配置模型接口和新建应用,用户可以在本地环境中实现AI对话功能。这种方案既保证了数据隐私,又提供了灵活的AI应用开发能力。

Linda的自动化测试之旅 1535

【面试题 17.19. 消失的两个数字】

在数组中的 n - 2 个数后面添加从 1 到 n 的每个整数各一次,则得到 2n - 2 个数字,其中两个在数组中消失的数字各出现一次,其余每个数字各出现两次。寻找消失的数字,最直观的方法是使用哈希表存储数组中出现过的数字。这样一来,我们就可以把从 1 到 n 的所有整数分成两类,其中一类包含所有二进制表示的第 l 位为 0 的数,另一类包含所有二进制表示的第 l 位为 1 的数。对于任意一个在数组 nums 中出现一次的数字,这些数字在上述 2n - 2 个数字中出现两次,两次出现会被包含在同一类中;

Sugar_wolf的博客 372

基于CANopenNode协议栈在正点原子探索者开发板上进行移植

配置好之后进行采用keil IDE进行代码生成即可,还需要进行CANopenNode的代码集成,并参照demo进行代码移植。发送完成后心跳包以1s的周期重新开始发送。正点原子的开发板引出的是CAN1接口。这里的心跳时间间隔设置为100ms。则将心跳包周期设置为0。

wangfandashe的博客 4694

异或运算学习

无

weixin_53136736的博客 434

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6787

从零到一:RK3588平台上的星闪模块驱动移植全解析

本文详细解析了在RK3588平台上移植UB37星闪模块驱动的完整流程,涵盖内核配置、设备树适配、驱动编译、功能测试等关键步骤。通过实践指导,帮助开发者掌握星闪技术在嵌入式系统中的集成与应用,提升无线通信模块的开发效率。

qsc90123456的博客 337

消失的两个数字(1~N缺两个数)

问题描述 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 解题算法 法一:位运算 class Solution { public: //数组完全可能是乱序 vector<int> missingTwo(vector<int>& nums) { vector<int> res; //法一:异或法 想办法将两个数分开,有点类似一si

Salmon_lee的博客 3108

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 648

面试题 17.19. 消失的两个数字

题目 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例1: 输入: [1] 输出: [2,3] 示例2: 输入: [2,3] 输出: [1,4] 分析: 本题要求空间复杂度是O(1)O(1)O(1), 有以下三种方法: 方法1: 假设缺失的两个数是a, b, 那么对N个数求和减去数组中的元素,就能得到a+ba+ba+b的结果,同理对N个数求平方和减去数组中元素的平方和,就能得到a2+b2a^

chenghaoy的博客 379

全球建筑物提取数据集(免费下载):微软/GlobalMLBuildingFootprints

这个是GitHub上的开源数据集: https://github.com/microsoft/GlobalMLBuildingFootprints 介绍 必应地图正在世界各地发布开放式建筑足迹。我们从 2014 年到 2021 年间的 Bing Maps 图像中检测到了 7.77 亿座建筑物,包括 Maxar 和 Airbus 的图像。数据可在 ODbL 下免费下载和使用。该数据集补充了我们的其他版本。 包括的地区 执照 此数据由 Microsoft 根据Open Dat..

此星光明博客 6289

李航《统计学习方法》课后习题答案(第2版)

李航《统计学习方法》课后习题答案(第2版) 章节 链接 第1章 统计学习及监督学习概论 点击进入 第2章 感知机 点击进入 第3章 k近邻法 点击进入 第4章 朴素贝叶斯法 点击进入 第5章 决策树 点击进入 第6章 逻辑斯谛回归与最大熵 点击进入 第7章 支持向量机 点击进入 第8章 提升方法 点击进入 第9章 EM算法及其推广 点击进入 第10章 隐马尔可夫模型 点击进入 第11章 条件随机场 点击进入     也可进入我的个人主页查看分类专栏

weixin_43646592的博客 2万+

【LeetCode】面试题 17.19. 消失的两个数字

【LeetCode】面试题 17.19. 消失的两个数字题解

passnight的博客 644

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

【优选算法】位运算:判断字符是否唯一,丢失的数字,两整数之和,只出现一次的数字,消失的两个数字

本文总结了位运算在算法题中的常见应用技巧,包括7种基本位操作和6道典型力扣题目解析。主要内容包括:1)位运算基础操作(位判断、修改、提取等);2)位图思想的原理与应用;3)异或运算的数学性质;4)6道力扣题目(字符唯一性判断、缺失数字、两数之和、只出现一次数字等)的位运算解法思路和代码实现。文章通过具体案例展示了如何利用位运算高效解决算法问题,特别适合需要优化时间和空间复杂度的场景。

记录了从0学习Java技术栈的日常 619

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ADA106接口板深度解析:工业级ADDA信号链设计实战

模数转换(ADC)与数模转换(DAC)是嵌入式系统连接物理世界与数字世界的核心技术。其性能不仅取决于芯片参数,更由电源完整性、地平面分割、基准稳定性及器件协同时序等底层工程细节决定。在电磁干扰强、温漂显著、空间受限的工业现场,高分辨率未必等于高可靠性——真正关键的是信号链整体鲁棒性与长期稳定性。ADA106作为典型国产工控接口板,集成了ADC08060、DAC908E、MC34063等器件,通过精密布局、低温漂选型与硬件级同步机制,实现了8位高速采样与10位精密输出的平衡。本文聚焦ADDA混合信号接口的工程

weixin_33984032的博客 451

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迷茫的一周(刷牛客题) 2025/3/28

怀疑人生,知识学一次忘一次

yesyesyes_yes的博客 1055

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

05阶段:NLP自然语言处理基础(1)

one-hot编码的优劣势:劣势:完全割裂了词与词之间的联系,而且在大语料集下,每个向量的长度过大,占据大量内存.正因为one-hot编码明显的劣势,这种编码方式被应用的地方越来越少,取而代之的是接下来我们要学习的稠密向量的表示方法word2vec和word embedding.word2vec介绍 1- 是将文本变成词向量张量的一种方法,是一种无监督(自监督)的训练方法,本质是训练一个模型,将模型的参数矩阵当作所有词汇的词向量表示。基于one-hot的形式进行优化改造 2-

专注前端开发领域,深耕 Python AI Agent应用开发,热爱探索 Web 与人工智能的前沿技术。 338

程序员面试金典 - 面试题 17.19. 消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?以任意顺序返回这两个数字均可。

随便发挥的博客 168

面试题 17.19. 消失的两个数字(妙用异或)

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?以任意顺序返回这两个数字均可。

weixin_44639164的博客 329

LeetCode刷题-消失的两个数字

前言说明 算法学习,日常刷题记录。 题目连接 消失的两个数字 题目内容 给定一个数组,包含从1到N所有的整数,但其中缺了两个数字。你能在O(N)时间内只用O(1)的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例1: 输入: [1] 输出: [2,3] 示例2: 输入: [2,3] 输出: [1,4] 提示: nums.length <= 30000 分析过程 思路:使用总和累减法,用总和累减法可以找出缺失的一个数字,而这里缺失的是两个数字,那么先用总和累减法找出缺失的两个数字的总和

纯洁的博客 1028

消失的两个数字(python)

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 输入: [1] 输出: [2,3] 示例 2: 输入: [2,3] 输出: [1,4] *题目来源:力扣(LeetCode)* 假设完整数组长度为L,输入数组为N,则 L=N+2。 当输入数组[1],N=1,L=3; 此时完整数组应该是1~3的数组,即[1, 2, 3]。 对比两组数据的不同: [1, 2, 3] [1] 不同是

Nnnn的博客 538

leetcode面试题 17.19. 消失的两个数字

题目 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 输入: [1] 输出: [2,3] 示例 2: 输入: [2,3] 输出: [1,4] 提示: nums.length <= 30000 来源:力扣(LeetCode) 思路分析   如果不考虑 O(1) 的空间复杂度,可以利用 set 先存好 1 到 N 的整数,然后遍历数组,如果该值包含在 set 中,就从 set 中移出该

a1819797401的博客 773

LeetCode每日一题——面试题 17.19. 消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。

hyk的博客 456

Leetcode之消失的两个数字

题目: 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 输入: [1] 输出: [2,3] 示例 2: 输入: [2,3] 输出: [1,4] 提示: nums.length <=30000 代码: 方法一——首先对数组进行排序;遍历该数组,记录一个sum变量值和一个temp变量值,sum变量记录的是,从1到i(i表示遍历到的数组下标)的数和,temp表示从1到n.

qq_35455503的博客 833

LeetCode hard 面试题 17.19.消失的两个数

题目描述: 给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 输入: [1] 输出: [2,3] 示例 2: 输入: [2,3] 输出: [1,4] 提示: nums.length <= 30000 题解: 方法一:求和解法 先求的缺失的两个数的和sumTwo以及平均值temp,通过temp将数组分组,大于temp的一组,小于的一组。如果两个两个数不相等,则两个

Ricardo_xia的博客 648

leetcode-面试题 17.19:消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?数组后补两个-1,使用抽屉原理对数组进行排序,O(n)的时间复杂度,再遍历一遍数组找到两个-1的位置就是答案。由于nums是1~N的,并且少了两个数,总数为N-2。对于重复的数,位运算可以消掉,后续就和。那么再补上1~N的数,总数为2N-2。以任意顺序返回这两个数字均可。

菊头蝙蝠的博客 671
上一篇: LVS是什么及作用?
下一篇: 最大公约数的四种方法
Hell_potato777
博客等级 码龄6年 47粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值