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

Python 如何改进程序以查找未排序数组中缺少的最小正数?,python,arrays,Python,Arrays,我编写了以下代码来解决这个难题,以找到正确的答案 我将变量I初始化为1,因为我们只对范围[1,sizeOfList+1]感兴趣,当我在列表中找到in时,我会增加变量,以确定列表中是否存在下一个数字。我认为我的逻辑是正确的,但事实并非如此。谁能解释一下为什么我的逻辑不正确。问题很简单,你只做了一次拍摄。因此,想象一个列表,1位于最末尾。您在该列表上迭代,查找1,在这种情况下i-j=0将为真(顺便说一句,这是可读的i==j)。您在最后一个索引处找到它,因此将i增加到2 但是在去那里的时候,你跳过了所

我编写了以下代码来解决这个难题,以找到正确的答案


我将变量
I
初始化为
1
,因为我们只对范围
[1,sizeOfList+1]
感兴趣,当我在列表中找到in时,我会增加变量,以确定列表中是否存在下一个数字。我认为我的逻辑是正确的,但事实并非如此。谁能解释一下为什么我的逻辑不正确。

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

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

为了使用您的解决方案,您必须重复该操作多达
n=len(A)
次,这使得您的解决方案是二次的

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

解决此问题的一种简单方法是搜索给定数组中从1开始的所有正整数。我们可能需要在给定数组中搜索最多n+1个数字。所以这个解在最坏的情况下取O(n^2)


这是一个复杂度为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

假设列表确实包含所有连续的、非重复的整数,但有一个丢失的条目除外,该条目假定不在列表的开头或结尾,那么这将是一个很好的解决方案:

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)

“我认为我的逻辑是正确的,但事实并非如此”——你怎么知道?失败的案例是什么?你返回一个大写字母i;这是个问题吗?如果我没有遗漏任何内容,至少它没有定义在何处。您假设数组包含从1开始的元素,这是不正确的。。如果你的数组包含19到38个元素,会发生什么情况?@jornsharpe,我在interview.com上提交了我的代码,它失败了。你能比“失败”更具体一些吗?你试过测试吗?
def firstMissingPositive(A):
    sorted_A = sorted(A)
    for index, value in enumerate(sorted_A):
        if value - sorted_A[0] > index:
            return value - 1