Algorithm 分治算法,用于查找一个非';t重复
如果我有一个排序的整数列表,其中除一个元素外的每个元素都是重复的,那么如何在不到O(n)的时间内找到singleton元素呢 例如:(−2.−2,5,5,5,67,67,72,80,80,80,80)将返回72 我相当肯定二进制搜索涉及其中,但不确定如何实现它。我只是在这里寻找伪代码Algorithm 分治算法,用于查找一个非';t重复,algorithm,binary-search,Algorithm,Binary Search,如果我有一个排序的整数列表,其中除一个元素外的每个元素都是重复的,那么如何在不到O(n)的时间内找到singleton元素呢 例如:(−2.−2,5,5,5,67,67,72,80,80,80,80)将返回72 我相当肯定二进制搜索涉及其中,但不确定如何实现它。我只是在这里寻找伪代码 我正在考虑遍历列表,并对当前元素的最后一次出现进行二进制搜索。如果它的索引与我们当前使用的索引相同,那就是singleton元素。如果没有,继续。我想那应该是O(nlogn) 如果每个整数可以重复任意次数,最好的算
我正在考虑遍历列表,并对当前元素的最后一次出现进行二进制搜索。如果它的索引与我们当前使用的索引相同,那就是singleton元素。如果没有,继续。我想那应该是O(nlogn) 如果每个整数可以重复任意次数,最好的算法是
O(n)
,因为无法避免迭代每个整数。只需在列表中进行迭代,并保留一个计数器,指示在一行中找到了多少相同的整数。如果计数器只有一个,并且发现了一个新的整数,那么终止,因为我们已经找到了非重复整数
如果我们知道所有数字重复的次数相同(除了不重复的数字),我们可以使用二进制搜索来实现更好的时间复杂度。但是,根据您的示例问题,情况似乎并非如此。O(n)Python实现:
def find_singletons(items):
singletons = []
a, b = items[:2]
for item in items[2:]:
if a != b and b != item:
singletons.append(b)
a, b = b, item
return singletons
items = [-2, -2, 5, 5, 5, 67, 67, 72, 80, 80, 80, 80]
print(find_singletons(items))
# [72]
另一个O(n)Python实现(使用计数器):
输入总是排序的吗?是的,总是一个排序的列表。是什么让你认为这实际上是可能的?“我在考虑遍历列表”-你不能在少于O(N)timeO(N)
def find_singletons2(items):
singletons = []
count = 1
last_item = items[0]
for item in items[1:]:
if last_item != item:
if count == 1:
singletons.append(last_item)
count = 1
else:
count += 1
last_item = item
return singletons
items = [-2, -2, 5, 5, 5, 67, 67, 72, 80, 80, 80, 80]
print(find_singletons(items))
# [72]