面试金典--面试题 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]
        ```
相关推荐
Revolution6123 分钟前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
Hi李耶27 分钟前
【LeetCode】9-回文数
算法·leetcode·职场和发展
GitLqr15 小时前
深入理解 Flutter 架构:从 Widget 到 GPU 像素的全链路解析
flutter·面试·dart
众人皆醒我独醉17 小时前
TGI:HuggingFace 的官方推理服务——不止 PagedAttention,更懂模型生态
面试·llm·ai编程
众人皆醒我独醉17 小时前
vLLM:PagedAttention 如何让 LLM 推理吞吐提升 24 倍
面试·llm·ai编程
神奇小汤圆18 小时前
面试官突然问:“数仓哪一层最适合做RAG?”他一下被问住了…
面试
一只旭宝18 小时前
C++手写shared_ptr共享智能指针|原子引用计数、强弱引用控制块、赋值重载底层深度剖析
开发语言·c++·面试
神奇小汤圆19 小时前
工业级 RAG 为什么需要 Elasticsearch?一篇讲清索引、度量、过滤与 Milvus 选型
面试
杨逢昌工厂6S管理21 小时前
44-6S 管理回潮问题根治:归位三定闭环法的体系化落地路径|杨逢昌
经验分享·笔记·职场和发展·学习方法
程序员三藏1 天前
自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例