面试金典--面试题 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]
        ```
相关推荐
Ciderw17 分钟前
MySQL日志undo log、redo log和binlog详解
数据库·c++·redis·后端·mysql·面试·golang
一个 00 后的码农1 小时前
25旅游管理研究生复试面试问题汇总 旅游管理专业知识问题很全! 旅游管理复试全流程攻略 旅游管理考研复试真题汇总
考研·面试·面试问题·考研复试·旅游管理·复试调剂·面试真题
互联网杂货铺1 小时前
软件测试之压力测试
自动化测试·软件测试·测试工具·jmeter·职场和发展·测试用例·压力测试
hello_simon13 小时前
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
职场和发展·pdf·word·学习方法·word转pdf·石墨文档·word转换
武乐乐~15 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
张胤尘16 小时前
C/C++ | 每日一练 (2)
c语言·c++·面试
测试199816 小时前
接口测试工具:Postman
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
超爱吃士力架16 小时前
MySQL 中的回表是什么?
java·后端·面试
StickToForever18 小时前
第4章 信息系统架构(二)
经验分享·笔记·学习·职场和发展
Cutey91619 小时前
Vue 3 中 watch 的报错解析
前端·面试