文章目录
题目描述
给定一个数组,包含从 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]
```