给定array/list
integers
,输出重复项。
此外,我真正想要的是:哪些解决方案具有最佳时间性能?最好的空间表现?是否有可能同时拥有最佳时间和最佳空间性能?只是好奇。谢谢!
例如:给定列表[4,1,7,9,4,5,2,7,6,5,3,6,7]
,答案为[4,7,6,5]
(输出的顺序无关紧要)。
我在python
中写了我的解决方案。
这是我使用哈希和二进制搜索编写的一个解决方案。
def binarySearch(array, number):
start = 0
end = len(array)
mid = (end + start) // 2
while (end > start):
mid = start + (end - start) // 2
if array[mid] == number:
return (mid, True)
elif number > array[mid]:
if start == mid:
return (mid + 1, False)
start = mid
else:
end = mid
return (mid, False)
def findDuplicatesWithHash(array):
duplicatesHash = {}
duplicates = []
for number in array:
try:
index,found = binarySearch(duplicates, number)
if duplicatesHash[number] == 0 and not found:
duplicates.insert(index, number)
except KeyError as error:
duplicatesHash[number] = 0
duplicatesSorted = sorted(duplicates, key=lambda tup: tup)
return duplicatesSorted
答案 0 :(得分:2)
获取副本的一种方法:
l = [4,1,7,9,4,5,2,7,6,5,3,6]
import collections
print([item for item, count in collections.Counter(l).items() if count > 1])
答案 1 :(得分:1)
查找重复项与排序非常相似。也就是说,每个元素需要直接或间接地与所有其他元素进行比较,以找出是否存在重复。可以修改快速排序以输出具有相邻匹配元素的元素,其具有O(n)空间复杂度和O(n * log(n))平均时间复杂度。
答案 2 :(得分:1)
查找重复项有多种解决方案。鉴于此问题是完全通用的,可以假设给定n
值列表,重复数量位于[0, n/2]
范围内。
您可以想到哪些可能的方法?
哈希表方法:
如果值已经不存在于哈希表中,则在遍历列表时存储值。如果值存在,则表示您有重复。
Algorithm FindDuplicates(list)
hash_table <- HashTable()
duplicates <- List()
for value in list:
if value in hash_table:
duplicates.add(value)
else:
hash_table.add(value, true)
O(n)
遍历所有值O(n)
以保存哈希表中的所有可能值。排序数组
对数组进行排序并遍历邻居值。
Algorithm FindDuplicates(list)
list.sort()
duplicates <- Set()
for i <- [1, len(list)-1]:
if list[i] = list[i-1]:
duplicates.add(list[i])
O(n.logn) + O(n) = O(n.logn)
排序和遍历所有值O(1)
因为没有创建额外的空间来制作重复项检查每个值
对于每个值,检查数组中是否存在该值。
Algorithm Search(i, list):
for j <- [0, len(list)-1] - [i]:
if list[j] = list[i]:
return true
return false
Algorithm FindDuplicates(list)
duplicates <- Set()
for i <- [1, len(list)-1]:
if Search(i, list):
duplicates.add(list[i])
时间:O(n^2)
比较次数为n*n(-1)
空格:O(1)
因为没有创建额外的空格来制作重复项
注意:复制数组的空间不能包含在空间复杂度方程中,因为这是我们想要的结果。
你能想到更多吗?