问题是:
Design an O(log n) algorithm whose input is a sorted list A. The algorithm should return true if A contains at least 3 distinct elements. Otherwise, the algorithm should return false.
由于必须是O(logn),我尝试使用二进制搜索,下面是我编写的代码:
def hasThreeDistinctElements(A):
if len(A) < 3:
return False
minInd = 0
maxInd = len(A)-1
midInd = (maxInd+minInd)//2
count = 1
while minInd < maxInd:
if A[minInd] == A[midInd]:
minInd = midInd
if A[maxInd] == A[midInd]:
maxInd = midInd
else:
count += 1
maxInd -= 1
else:
count += 1
minInd += 1
midInd = (maxInd+minInd)//2
return count >= 3
有更好的方法吗
谢谢
第一次比较安全地检查是否有两个不同的值。如果是这样,我们检查大于
A[0]
的第一个值是否也小于A[-1]
(*):如果
A
为空,则不会崩溃或者不使用
bisect
,二进制搜索A[1:-1]
中的第三个值。不变量是,如果有,它必须在A[lo : hi+1]
中:为了真正成为
O(logN)
,对边界索引minInd,maxInd
的更新只应该是搜索空间的一半。因为通过循环体的路径只有
分别而言,我不确定您是否无法创建函数为线性的数据。下面是一个更简单和有保证的
O(logN)
顺便说一句,如果您可以使用标准库,那么它非常简单:
是的,有更好的方法
在对列表进行排序后,您可以使用二进制搜索,只需稍作自定义修改,如下所示:
当我们在递归的每次迭代中将数组分成2部分时,它将需要最多log(n)个步骤来检查它是否包含3个唯一的元素
时间复杂度=O(log(n))。
相关问题 更多 >
编程相关推荐