📌  相关文章
📜  排序数组中缺失数字的计数(1)

📅  最后修改于: 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)$。

以上就是本题的思路及代码实现。