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