📌  相关文章
📜  查找未排序数组中缺少的最小正数|套装3(1)

📅  最后修改于: 2023-12-03 15:10:45.761000             🧑  作者: Mango

查找未排序数组中缺少的最小正数|套装3

在本套装中,我们将介绍如何查找未排序数组中缺少的最小正数。这个问题可以通过多种方法解决,我们将会探讨其中的三个。

方法一:排序法

我们可以先对数组进行排序,然后从小到大扫描整个数组,找到第一个不在数组中的正整数。时间复杂度为O(nlogn)。

def find_missing_number(nums):
    nums.sort()
    missing_number = 1
    for num in nums:
        if num == missing_number:
            missing_number += 1
        elif num > missing_number:
            break
    return missing_number
方法二:哈希表法

我们可以使用哈希表来记录数组中的每个数出现的次数,然后从小到大扫描整个正整数序列,找到第一个不在哈希表中的正整数。时间复杂度为O(n)。

def find_missing_number(nums):
    nums_dict = {}
    for num in nums:
        if num > 0:
            nums_dict[num] = nums_dict.get(num, 0) + 1
    missing_number = 1
    while missing_number in nums_dict:
        missing_number += 1
    return missing_number
方法三:原地置换法

我们可以对于每个出现在数组中的正整数nums[i],将它交换到nums[nums[i]-1]位置上。然后再从前往后扫描整个数组,找到第一个不在正确位置上的数,它就是最小的缺失正整数。时间复杂度为O(n)。

def find_missing_number(nums):
    n = len(nums)
    for i in range(n):
        while 1 <= nums[i] <= n and nums[nums[i]-1] != nums[i]:
            nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
    for i in range(n):
        if nums[i] != i+1:
            return i+1
    return n+1

以上是本套装介绍的三种方法,根据不同的情况选择不同的方法来解决该问题。