![](/img/trans.png)
[英]Find missing elements in a list created from a sequence of consecutive integers with duplicates in O(n)
[英]Find duplicates in a array/list of integers
给定一个array/list
integers
array/list
,输出重复项。
另外,我真正想要的是:哪些解决方案具有最佳时间性能? 最好的空间表现? 是否有可能同时拥有最佳时间和最佳空间性能? 只是好奇。 谢谢!
例如:给出清单[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
获取副本的一种方法:
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])
查找重复项与排序非常相似。 也就是说,每个元素需要直接或间接地与所有其他元素进行比较,以找出是否存在重复。 可以修改快速排序以输出具有相邻匹配元素的元素,其具有O(n)空间复杂度和O(n * log(n))平均时间复杂度。
有多种解决方案可以找到重复项。 鉴于此问题是完全通用的,可以假设给定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)
因为没有创建额外的空间来产生重复
注意:复制数组的空间不能包含在空间复杂度方程中,因为这是我们想要的结果。
你能想到更多吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.