📅  最后修改于: 2023-12-03 14:56:43.261000             🧑  作者: Mango
在排序算法中,问题13 是指现在有n个数,每个数都在1到n之间,其中有一个数重复了,同时另一个数缺失了。现在我们需要求出重复的数和缺失的数。
常规做法是先将原数组排序,然后从头到尾扫描一遍,找到这两个数。但是这个做法的时间复杂度为O(nlogn)。下面介绍一种时间复杂度为O(n)的做法。
我们先强调一下题目里的一些条件:
因此,我们可以用数组下标和值之间的关系来解决这个问题。具体做法如下:
具体实现可以参考代码片段:
def find_duplicate_missing(nums):
length = len(nums)
duplicate = -1
for i in range(length):
index = abs(nums[i]) - 1
if nums[index] < 0:
duplicate = abs(nums[i])
else:
nums[index] *= -1
for i in range(length):
if nums[i] > 0:
missing = i + 1
break
return [duplicate, missing]
上述算法的时间复杂度为O(n),因为它只需要扫描两遍数组。空间复杂度也是O(1),因为它只需要常数个额外变量来记录。
需要注意的是,上述算法会修改原数组,因此如果需要保留原数组,需要先复制一份。