这段Python代码是快速排序的修改版:
def findDuplicate(arr):
orig_len = len(arr)
if orig_len <= 1:
return None
pivot = arr.pop(0)
greater = [i for i in arr if i > pivot]
lesser = [i for i in arr if i < pivot]
if len(greater) + len(lesser) != orig_len - 1:
return pivot
else:
return findDuplicate(lesser) or findDuplicate(greater)
我认为它可以在O(n logn)的时间内找到重复项。它使用了堆栈上的额外内存,但我相信它可以重新编写以仅使用原始数据的一份副本:
def findDuplicate(arr):
orig_len = len(arr)
if orig_len <= 1:
return None
pivot = arr.pop(0)
greater = [arr.pop(i) for i in reversed(range(len(arr))) if arr[i] > pivot]
lesser = [arr.pop(i) for i in reversed(range(len(arr))) if arr[i] < pivot]
if len(arr):
return pivot
else:
return findDuplicate(lesser) or findDuplicate(greater)
产生 greater 和 lesser 的列表推导式通过调用pop()破坏了原始数据。如果从中删除greater和lesser后,arr不为空,则必须存在重复项,且重复项为pivot。
对于排序数据,代码会出现常见的堆栈溢出问题,因此需要使用随机枢轴或迭代解决方案将数据排队:
def findDuplicate(full):
import copy
q = [full]
while len(q):
arr = copy.copy(q.pop(0))
orig_len = len(arr)
if orig_len > 1:
pivot = arr.pop(0)
greater = [arr.pop(i) for i in reversed(range(len(arr))) if arr[i] > pivot]
lesser = [arr.pop(i) for i in reversed(range(len(arr))) if arr[i] < pivot]
if len(arr):
return pivot
else:
q.append(greater)
q.append(lesser)
return None
然而,现在代码需要在循环的顶部进行数据的深度复制,这会改变内存需求。
计算机科学就到此为止。Python中的排序算法可能导致我的代码被朴素算法覆盖:
def findDuplicate(arr):
arr = sorted(arr)
prev = arr.pop(0)
for element in arr:
if element == prev:
return prev
else:
prev = element
return None