我编写了以下代码来解决难题,找到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时,我会增加变量以确定是否列表中是否存在下一个号码。我认为我的逻辑是对的,但事实并非如此。任何人都可以解释为什么我的逻辑不正确。
答案 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)