如何改进我的程序以找到未排序数组中缺少的最小正数?

时间:2015-10-16 07:39:17

标签: python arrays

我编写了以下代码来解决难题,找到smallest positive number missing from an unsorted array

def firstMissingPositive(A):
    i = 1
    for j in A:
        if i - j == 0:
            i += 1
    return I

我将变量i初始化为1,因为我们只对范围[1, sizeOfList+1]感兴趣,并且当我发现列表中出现in时,我会增加变量以确定是否列表中是否存在下一个号码。我认为我的逻辑是对的,但事实并非如此。任何人都可以解释为什么我的逻辑不正确。

3 个答案:

答案 0 :(得分:1)

问题只是你只做了一次。想象一下1最后的列表。您迭代该列表,查找1,在这种情况下i - j = 0将为真(顺便说一下,i == j是可读的)。您可以在最后一个索引处找到它,因此您将i增加到2

但是在去那里时,你跳过了所有其他不是1的数字。所以你不知道你之前是否真的遇到了2

为了使用您的解决方案,您必须重复最多n = len(A)次,这使您的解决方案成为二次方。

在您的链接文章中,这被描述为“天真的解决方案”:

  

解决此问题的天真方法是搜索所有正整数,从给定数组中的1开始。我们可能必须在给定数组中搜索最多n + 1个数字。因此,在最坏的情况下,此解决方案需要O(n ^ 2)。

答案 1 :(得分:-1)

这是一个复杂度为O(n ^ 2)的解决方案。一个小的优化是我们总是从列表中删除最低正数的项目,因此我们不必再次迭代它。

def firstMissingPositive(A):
    return helper(A, 1)

def helper(list, lowest):
    if len(list) == 0:
        return lowest
    for i in range(0, len(list)):
        num = list[i]
        if num == lowest:
            del list[i]
            return helper(list, lowest+1)
    return lowest

print firstMissingPositive([1,2,5,6,3]) # -> 4

答案 2 :(得分:-1)

假设列表实际上确实具有所有连续的非重复整数,除了一个缺失的条目(假设不在列表的开头或结尾),那么这将是一个很好的解决方案:

def firstMissingPositive(A):
    sorted_A = sorted(A)
    for index, value in enumerate(sorted_A):
        if value - sorted_A[0] > index:
            return value - 1

这是O(nlogn)