我目前正在研究这个编码问题。
给定排序的n
个不同值以及目标值T
的数组,在O(n)
时间内确定数组中是否存在两个不同的值,它们总和为{ {1}}。 (例如,如果数组包含T
,3
,5
,6
以及7
和9
,那么您的方法就是写入应该返回T = 14
,因为true
。如果对于相同的值数组5+9 = 14
,它应该返回false
。)
所以,最初,我刚用嵌套线性搜索方法编写问题,这显然导致T = 17
运行时建立基线以简化,但是,到目前为止,我只能简化它到O(n^2)
。我这样做是通过创建一个由O(n log(n))
的差异组成的新数组,然后使用嵌套在线性上升到新数组的循环中的二进制搜索将新数组与原始数组进行比较。
我不是要求答案,而是提示在哪里寻求简化我的代码。我觉得数组排序对于将其降低到Target - array[i]
非常重要,但不知道如何去做。
谢谢你的时间!
答案 0 :(得分:5)
想象一下,你有两个指针(s,e)设置在数组的开头和结尾。
如果你将它们向相反的方向移动(使用特定的算法)并查看元素的总和,你会看到移动一个指针会增加summ并移动其他减少。
你需要的东西是找到平衡。
如果它没有帮助。请求下一个提示。
答案 1 :(得分:1)
提示:
二进制搜索之类的东西,从中间开始(与中间比较)
we have startindex = 0, endindex = N-1
while(some condition){
middleindex = endindex - startindex / 2, middle = array[middleindex]
if T - array[middleindex] > middle, startindex = middleindex
if T - array[middleindex] < middle, endindex = middleindex
}
它将在O(log(n))中执行任务:D
答案 2 :(得分:1)
一些提示/步骤:
1 - 按array[i]
开始迭代,T
是array[0]
中最接近的较低值
2 - 将另一个指针移动到T
3 - 对两个值求和并与{{1}}进行比较
4 - 如果更大或更低,请在指针中进行适当的移动并重复步骤3