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

文章目录

题目描述

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

以任意顺序返回这两个数字均可。
示例 1:

输入: 1

输出: 2,3
示例 2:

输入: 2,3

输出: 1,4

思路分析

用数学方法做这个题是最简单的。

根据题意,给定 nums 的长度为 n,则补全之后的数组长度为m=n+2

补全之后的数组和利用等差数列求和公式来做,((1+m)*m)//2

所以有补全之后的数组总和-未补全的数组总和=缺失的两个数字和。
su = ((1+m)*m)//2-sum(nums)

我们找到缺失数组和的中间值,即 t = su//2。根据题意也知,缺失的两个数字不一样。那么缺失的两个数字必然在t的两侧,或者其中一个和t相等。

那么此时就转变成求 消失的一个数字 了。

直接找到nums里所有小于等于t的数字的和temp。然后再用一次等差数列减去temp,就能得到一个消失的数字了。进而得到第二个消失的数字

完整代码

python 复制代码
class Solution:
    def missingTwo(self, nums: List[int]) -> List[int]:
        
        n = len(nums)
        
        m = n+2
        su = ((1+m)*m)//2-sum(nums)        # 先找缺失值的和

        
        t = su//2

        temp = sum([x for x in nums if x<=t])
        
        res1 = ((1+t)*t)//2 - temp
        return [res1,su-res1]
        ```
相关推荐
Raink老师3 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
Cosolar3 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
小江的记录本4 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试
秦明月138 小时前
电芯装配测试线安全回路设计实战
经验分享·其他·职场和发展·创业创新·学习方法
Mahir0810 小时前
MyBatis 深度解密:从执行流程到底层原理全解
java·后端·面试·mybatis
程序员小远10 小时前
系统性能指标全解析
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
罗超驿10 小时前
9.LeetCode 209. 长度最小的子数组 | 滑动窗口专题详解
java·算法·leetcode·面试
折哥的程序人生 · 物流技术专研10 小时前
《Java 100 天进阶之路》第35篇:Java异常处理最佳实践
java·开发语言·后端·面试·求职招聘