Arrays 在排序数组中查找三个元素,它们的和为第四个元素
我的一个朋友最近得到了这个面试问题,在我们看来,这个问题是可以解决的,但不在面试官认为可能的渐进时间范围内。问题是: 您有一个Arrays 在排序数组中查找三个元素,它们的和为第四个元素,arrays,algorithm,search,Arrays,Algorithm,Search,我的一个朋友最近得到了这个面试问题,在我们看来,这个问题是可以解决的,但不在面试官认为可能的渐进时间范围内。问题是: 您有一个N整数数组,xs,已排序,但可能不不同。您的目标是找到四个数组索引(1)(a、b、c、d),以使以下两个属性保持不变: xs[a] + xs[b] + xs[c] = xs[d] a < b < c < d 现在还不清楚接下来该怎么做,但也许我们可以选择一些轴值p,然后搜索一个(a,b)对加上p,再搜索一个(d,c)对减去p。对于给定的P,通过从数组
N
整数数组,xs
,已排序,但可能不不同。您的目标是找到四个数组索引(1)(a、b、c、d)
,以使以下两个属性保持不变:
xs[a] + xs[b] + xs[c] = xs[d]
a < b < c < d
现在还不清楚接下来该怎么做,但也许我们可以选择一些轴值p,然后搜索一个(a,b)
对加上p,再搜索一个(d,c)
对减去p。对于给定的P,通过从数组两端向内搜索,在O(n)时间内进行搜索非常容易。然而,在我看来,这个问题是有N2个这样的值P,而不仅仅是其中的N个,所以我们实际上根本没有减少问题的大小:我们在做O(N)功,O(N2)次
我们在网上其他地方发现了一些相关的问题:在N2时间内是可以解决的,但需要提前确定总和;采用相同的算法,但对每个可能的和进行迭代,使我们始终处于N3
另一个相关的问题似乎是,但我不确定这里有多少东西是相关的:一个不平等而不是一个平等把事情弄混了很多,当然目标是固定的而不是变化的
那么,我们错过了什么?考虑到性能要求,这个问题到底是不可能的吗?还是有一个我们无法发现的聪明算法
(1) 实际上,所提出的问题是找到所有这样的
(a,b,c,d)
元组,并返回有多少元组的计数。但我认为,即使在规定的时间限制内找到其中一个,也已经足够困难了。因此,一个解决方案可以是:
列出所有可能的x[a]+x[b]值,使a
key = (x[a]+x[b]) and value = (a,b).
此步骤的复杂性-O(n^2)
现在列出所有可能的x[d]-x[c]值,使d>c。同样,对于每个x[d]-x[c],通过查询来搜索散列图中的条目。我们有一个解决方案,如果存在一个条目,使得任何命中的c>b。
这个步骤的复杂性-O(n^2)*H
其中H是hashmap中的搜索时间
总复杂度-O(n^2)*H。现在H可能是O(1)。如果数组中的值范围很小,则可以执行此操作。哈希函数的选择也取决于数组中元素的属性。如果算法必须列出满足条件的解集(即a、b、c和d),则最坏情况下的时间复杂度为O(n4): 1.可能存在O(n4)解决方案 简单的例子是一个数组,其中只有0个值。那么a、b、c和d只要它们保持有序,就拥有所有的自由。这表示O(n4)解决方案 但更一般地说,遵循以下模式的阵列具有O(n4)解决方案:
w, w, w, ... x, x, x, ..., y, y, y, ... z, z, z, ....
每个事件的发生次数相同,并且:
w + x + y = z
然而,为了只产生解的数量,算法可以具有更好的时间复杂度
2.算法
这是已经发布的算法的一个微小变化,它不涉及H因子。它还描述了如何处理不同配置导致相同和的情况
- 检索所有对并将它们存储在一个数组X,其中每个元素获得以下信息:
a:两者中最小的索引
b:另一个索引
sum:xs[a]+xs[b]
- 同时,还为另一个数组中的每一对存储以下内容:
c:两个索引中最小的索引
d:另一个索引
sum:xs[d]-xs[c]
- 按两个数组的元素的和属性对它们进行排序。如果值等于和,排序顺序将按如下方式确定:对于X数组,增加b;对于Y数组,通过减少c。排序可以在O(n²)O(n²logn)时间内完成
- 以“串联”方式遍历两个数组以找到相等的和对。如果是这种情况,则需要检查
。如果是这样,则表示一种解决方案。但可能有很多,在可接受的时间内计算这些和需要特别小心 设X[i].b
,即数组X中的元素数(也是数组Y的大小):m=n(n-1)/2
i=0
j=0
当iY[j]。总和:
j=j+1
其他:
#我们有一个解决方案。需要计算X和Y中具有相同和的所有其他值。
#查找Y中的最后一个匹配项并将k设置为其索引:
县=0
当kw + x + y = z