这个python代码是modification of QuickSort:
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 em>。
代码在排序数据上存在通常的堆栈溢出问题,因此需要随机枢轴或将数据排队的迭代解决方案:
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 中的代码,可能是因为 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