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

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

查找未排序数组中缺少的最小正数

在程序开发中,我们经常需要在一个未排序的数组中查找缺失的最小正整数。这个问题看似简单,实际上需要一些技巧和算法才能解决。

问题描述

给定一个未排序的整数数组,找到缺少的最小正整数。例如,对于数组 {1, 2, 0},输出 3,对于数组 {3, 4, -1, 1},输出 2

解决方案

解决这个问题有多种方法,以下是两个常见的算法。

算法一:哈希表法

我们可以通过建立一个哈希表来解决这个问题。我们遍历数组,将所有正整数存储到哈希表里。接着,我们从 1 开始扫描,找到第一个没有出现在哈希表中的数字。这个数字就是我们要找的答案。

哈希表的建立需要 O(n) 的时间,扫描需要 O(n) 的时间,所以时间复杂度为 O(n)。空间复杂度为 O(n),因为需要一个哈希表来存储所有正整数。

以下是一个使用哈希表法解决这个问题的 Python 代码片段:

def findMissingInteger(nums: List[int]) -> int:
    nums_set = set(nums)
    for i in range(1, len(nums_set) + 1):
        if i not in nums_set:
            return i
    return len(nums_set) + 1
算法二:原地哈希法

在算法一中,我们使用了一个哈希表来存储所有正整数。如果不想使用额外的空间,我们可以使用原地哈希法。具体来说,我们对数组进行原地哈希,将数组中的每个正整数放到其应该在的位置上。接着,我们从 1 开始扫描,找到第一个没有放在正确位置上的数字。这个数字就是我们要找的答案。

使用原地哈希法需要 O(n) 的时间,但需要使用数组本身来存储哈希表,所以空间复杂度为 O(1)。

以下是一个使用原地哈希法解决这个问题的 Python 代码片段:

def findMissingInteger(nums: List[int]) -> int:
    for i in range(len(nums)):
        while 1 <= nums[i] <= len(nums) and nums[nums[i] - 1] != nums[i]:
            nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]

    for i, num in enumerate(nums, 1):
        if num != i:
            return i

    return len(nums) + 1
总结

在本文中,我们介绍了两种算法来解决查找未排序数组中缺失的最小正数的问题。这个问题看似简单,实际上需要一些技巧和算法才能解决。我们可以使用哈希表法或者原地哈希法来解决这个问题。无论使用哪种方法,时间复杂度都是 O(n),但空间复杂度有所不同。当空间有限时,原地哈希法可能更加合适。