面试金典--面试题 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]
        ```
相关推荐
T___T2 小时前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人3 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
程序员杰哥3 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
勤劳打代码3 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
努力学算法的蒟蒻3 小时前
day10(11.7)——leetcode面试经典150
面试
进击的野人4 小时前
JavaScript 中的数组映射方法与面向对象特性深度解析
javascript·面试
南山安4 小时前
以腾讯面试题深度剖析JavaScript:从数组map方法到面向对象本质
javascript·面试
橘颂TA6 小时前
【剑斩OFFER】算法的暴力美学——二分查找
算法·leetcode·面试·职场和发展·c/c++
吃着火锅x唱着歌14 小时前
LeetCode 1128.等价多米诺骨牌对的数量
算法·leetcode·职场和发展
java1234_小锋16 小时前
Spring事件监听的核心机制是什么?
java·spring·面试