这是一个面试问题。给定一个已排序的整数数组和数字z,在数组中找到所有满足x+y<z的对(x,y)。是否可以比O(n^2)更好地完成?
P.S. 我知道我们可以在O(N)的时间内找到所有满足x+y==z的对(x,y)。
这是一个面试问题。给定一个已排序的整数数组和数字z,在数组中找到所有满足x+y<z的对(x,y)。是否可以比O(n^2)更好地完成?
P.S. 我知道我们可以在O(N)的时间内找到所有满足x+y==z的对(x,y)。
你不能保证在O(n)时间内找到所有具有此属性的值对,因为可能存在O(n2)个这样的值对。一般来说,算法运行所需的时间不会少于它产生的值的数量。
希望这可以帮到你!
在通常情况下,不能。考虑这样一种情况:x + y < z
对于数组中的所有x
和y
都成立。您必须触及(例如显示)集合中可能的n(n-1)/2
对。这是基本上是O(n^2)。
如果您添加了每个元素都是唯一的附加约束条件,您可以在O(N)中找到它们。
在找到所有x+y==z对之后,您知道对于满足该条件的每个x和y,比其配对低索引的每个x或y(选择一个)都满足x+y<z条件。
实际选择这些并输出它们需要O(n ^ 2)的时间,但从某种意义上说,x + y == z对是答案的压缩形式,以及输入。
(您可以将输入预处理为每个元素都是唯一的形式,并带有出现次数的计数器。这需要O(N)时间。您可以将此解决方案推广到未排序的数组,将时间增加到O(nlogn)。)
关于在线性比例下找到成对数的时间的理由:假设问题是“介于0和给定输入K之间的整数是什么”?
O(N)
,最坏的情况是O(N*logN)
,平均情况也是O(N*logN)
。你可以对数组进行排序,对于每个小于z的元素,使用二分查找-总共O(NlogN)。
总运行时间:O(|P| + NlogN),其中P是结果对。
这个问题实际上存在一个O(nlogn)的解决方案。 我会在首先检查是否允许的情况下,定义算法/函数的输出格式。
我会将其定义为元素(S,T)的序列。S-数组中元素的位置(或其值)。T-子数组[0,T]的位置。例如,如果T=3,则意味着元素S与元素0、1、2和3组合满足所需条件。
总体结果是O(nlogn)运行时间和O(n)内存。