Python 2使用二进制搜索的求和问题-正确解的条件
我通过对输入数组排序并使用二进制搜索,在不到二次方的时间内解决了2和问题。代码被移植到Python,因为Python是我最熟悉的语言 我对密码有点怀疑。关于“如果这指向我们,那么只有当元素的另一个副本存在时,这一对才存在。向前看,向后看。”的评论听起来很有权威性,但我不明白为什么Python 2使用二进制搜索的求和问题-正确解的条件,python,algorithm,Python,Algorithm,我通过对输入数组排序并使用二进制搜索,在不到二次方的时间内解决了2和问题。代码被移植到Python,因为Python是我最熟悉的语言 我对密码有点怀疑。关于“如果这指向我们,那么只有当元素的另一个副本存在时,这一对才存在。向前看,向后看。”的评论听起来很有权威性,但我不明白为什么I和恭维_idx不同是不够的。(该问题要求两个总和是不同的。) 请澄清一下?另外,解决方案是否正确 def binary_search(lst, target): low = 0 high = len(l
I
和恭维_idx
不同是不够的。(该问题要求两个总和是不同的。)
请澄清一下?另外,解决方案是否正确
def binary_search(lst, target):
low = 0
high = len(lst) - 1
while low <= high:
mid = (low + high) // 2
if lst[mid] == target:
return mid
elif lst[mid] > target:
high = mid - 1
else:
low = mid + 1
return None
def two_sum_binary_search(arr, total):
length = len(arr)
arr = sorted(arr)
for i in range(length):
compliment = total - arr[i]
compliment_idx = binary_search(arr, compliment)
if compliment_idx is not None: # Found solution!
"""
If this points at us, then the pair exists only if
there is another copy of the element. Look ahead of
us and behind us.
"""
# Why is it not sufficient that i and compliment_idx are different?
if compliment_idx != i or (i > 0 and arr[i - 1] == arr[i]) or (i < length - 1 and arr[i + 1] == arr[i]):
return (i, compliment_idx)
return None
assert two_sum_binary_search([1, 2, 3], 4) == (0, 2)
assert two_sum_binary_search([1234, 5678, 9012], 14690) == (1, 2)
assert two_sum_binary_search([2, 2, 3], 4) == (0, 1)
def二进制搜索(lst,目标):
低=0
高=透镜(lst)-1
虽然目标较低:
高=中-1
其他:
低=中+1
一无所获
def二元和二元搜索(arr,总计):
长度=长度(arr)
arr=已排序(arr)
对于范围内的i(长度):
恭维=总计-arr[i]
恭维idx=二进制搜索(arr,恭维)
如果恭维不是无:#找到解决方案!
"""
如果这指向我们,那么这一对只有在
元素还有另一个副本。请向前看
我们和身后。
"""
#为什么我和恭维的idx不同还不够?
如果你赞美我i或(i>0和arr[i-1]==arr[i])或(i
嗯,这就足够了。这是因为compaid\u idx
是compaid
的一个确定性函数(实际上应该是s/compaid/complement/g)。如果我们处于多个副本的情况下,complaid\u idx
的值对于每个副本都是相同的,因此另一个副本将满足complaid\u idx!=我
。假设如果搜索不是确定性的,我们需要由给定代码实现额外的搜索。Hmm,在这里就足够了。这是因为compaid\u idx
是compaid
的一个确定性函数(实际上应该是s/compaid/complement/g)。如果我们处于多个副本的情况下,complaid\u idx
的值对于每个副本都是相同的,因此另一个副本将满足complaid\u idx!=我
。假设如果搜索不是确定性的,我们将需要由给定代码实现的附加搜索。此函数返回(0,0)
用于打印(二元搜索([2,2,4])
。那是正确的输出吗?不,那是错误的输出。额外的检查似乎破坏了算法。此函数为打印返回(0,0)
(二元搜索([2,2,4])
。那是正确的输出吗?不,那是错误的输出。额外的检查似乎破坏了算法。我不确定你关于非确定性搜索的确切意思,但主要的一点是额外的检查似乎不需要。事实上,正如@1490;㪞דבקן所指出的,他们让代码为打印(两个求和二进制搜索([2,2,4])
给出了错误的(0,0)
,所以他们必须走!奇怪的是,代码中的注释看起来如此自信……我不确定您对非确定性搜索的确切含义,但主要的一点是,似乎不需要额外的检查。事实上,正如@1490;㪞דבקן所指出的,他们让代码为打印(两个求和二进制搜索([2,2,4])
给出了错误的(0,0)
,所以他们必须走!奇怪的是代码中的注释看起来如此自信。。。