这是一个面试问题。给定排序的整数数组和数字z,找到数组中的所有对(x,y),使得x + y <1。 ž。它可以比O(n ^ 2)更好吗?
P.S。我知道我们可以在O(N)中找到所有对(x,y | x + y == z)。
答案 0 :(得分:9)
您不一定能在O(n)时间内找到所有这些对,因为可能存在具有此属性的O(n 2 )值对。通常,算法运行的时间不会少于它产生的值的数量。
希望这有帮助!
答案 1 :(得分:5)
在生成中,不,它不能。考虑数组中所有x + y < z
,x
y
的情况。您必须触摸(例如显示)集合中所有n(n - 1)/2
个可能的对。这基本上是O(n ^ 2)。
答案 2 :(得分:2)
如果要求输出满足该属性的所有对,我认为没有比O(N ^ 2)更好的东西,因为输出中可能有O(N ^ 2)对。
但对于x + y = z也是如此,你声称有一个O(N)解决方案 - 所以我可能会遗漏一些东西。
我怀疑最初的问题要求对的数量。在那种情况下,它可以在O(N log(N))中完成。对于每个元素x找出y = z - x并在数组中对y进行二进制搜索。 y的位置给出了可以用x的特定值形成的对的数量。对数组中的所有值求和,可以得到答案。如果每个对都采用O(log(N))(二分搜索),则有N个值并找到数字,所以整个事物是O(N log(N))。
答案 3 :(得分:1)
如果添加每个元素唯一的附加约束,您可以在O(N)中找到它们。
在找到所有x + y == z对之后,您知道对于满足该条件的每个x和y,每个x或y(选择一个)索引的索引低于其对,满足x + y&lt; z条件。
实际上选择这些并输出它们需要O(n ^ 2),但从某种意义上说,x + y == z对是答案的压缩形式,连同输入。
(您可以将输入预处理到每个元素唯一的表单,以及出现次数的计数器。这将花费O(N)时间。您可以将此解决方案推广到未排序的数组,将时间增加到O (nlogn)。)
说明在时间上找到对与解的大小成线性比例的理由:假设问题是“0和给定输入K之间的整数是什么”?
答案 4 :(得分:1)
因为它是排序整数数组,您可以使用二进制搜索算法,所以最好是O(N)
,最差的是{{1 },平均情况也是O(N*logN)
。
答案 5 :(得分:0)
您可以对数组进行排序,对于每个小于z的元素,使用二进制搜索 - 总O(NlogN)。
总运行时间:O(| P | + NlogN),其中P是结果对。
答案 6 :(得分:0)
这个问题实际上存在O(nlogn)解决方案。 我会做什么(先检查我是否允许这样做)是定义我的算法/函数的输出格式。
我将其定义为一系列元素(S,T)。 S - 元素在数组中的位置(或其值)。 T - 子阵列[0,T]的位置。因此,例如,如果T = 3,则意味着元素S与元素0,1,2和3结合满足所需条件。
总结果是O(nlogn)运行时间和O(n)内存。