📅  最后修改于: 2023-12-03 15:10:10.319000             🧑  作者: Mango
在一个排序数组中,有些数字缺失了。例如,一个长度为 $N$ 的有序数组 $[0,1,2,3,...,N-1]$ 中,若数字 $i$($0 \leq i \leq N-1$)缺失,则其之后的数字均会依次前移一位,造成后面数字变化。现在,有一个长度为 $N-1$ 的整数数组,即原有序数组中除了问题数字之外的数字。请找出所有缺失的数字,以有序数组的形式输出。
本题可以采用二分查找的思路来解决,核心问题是如何找出缺失的数字。我们可以计算出整个数组的数字和 $S$,然后再计算出现有数组的数字和 $S_1$,那么两者之差即为缺失数字的和。最终根据公式 $S-\dfrac{(0+N-1)\times N}{2}=S_1$ 可以求出缺失数字的和,进而通过遍历缺失数字范围内的数字来找出所有缺失数字。
以下是Python的代码实现:
from typing import List
class Solution:
def missingNumbers(self, nums: List[int]) -> List[int]:
n = len(nums) + 1
total = n * (n - 1) // 2 # 整个数组的数字和
missing = total - sum(nums) # 缺失数字的和
res = []
prev = 0 # 上一个出现数字的下标
for i, num in enumerate(nums):
if num - prev > 1: # 说明有数字缺失
for j in range(prev + 1, num): # 将缺失数字全部添加到结果集
res.append(j)
prev = num
if missing > prev: # 最后一个数字之后也有数字缺失
for j in range(prev + 1, missing + 1):
res.append(j)
return res
其中,时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。
以上就是本题的思路及代码实现。