查找三角形的边数

时间:2017-02-06 06:50:31

标签: algorithm

我给出的数组A由整数组成,我必须选择数组A中的任意两个整数和范围[L,R]中的任何第三个整数,这样所有三个整数都形成一个有效的三角形。 / p>

我必须通过从数组A中选择任意两个值来找到范围[L,R]中可用于形成有效三角形的整数。

我知道如果我知道双方,那么第三方必须是范围a-b<x<a+b 其中a和b是A中的任意两个整数。

如何在O(N) N= Size of A时间内找到[L,R]中的有效整数数。 L和R并且非常大到10^20

2 个答案:

答案 0 :(得分:0)

据我了解,完整的枚举将通过以下参数产生有效的解决方案。在任何选择A元素的情况下,会出现最大数量的可能解决方案,从而为三角形提供一致的边长选择。例如,这样的输入将是值N的{​​{1}}倍的输入。但是,从1中选择的三元组数量可以通过

来限制
A

(其中(n choose 3) = n!/(3!(n-3)) = n!/(6(n-3)!) = (1/6)*(n-2)*(n-1)*n <= n^3 表示二项式系数),它是多项式数的选择。任何选择都可以在恒定时间内检查有效性,因为只涉及3个值。

答案 1 :(得分:0)

现在比赛已经结束,所以这是我在比赛中解决问题的方法。

问题在于询问x[L,R]的{​​{1}}个数与(a_i, a_j)中的任何一对A形成三角形。

天真的方法是对O(N^2 * (R-L+1)) = O(N^2 * (R-L))

的所有对进行粗暴对待

但实际上,我们不需要测试所有O(N^2)对,我们只需要测试O(N) IF A已排序,即全部对于i&gt;的相邻对(a_i-1, a_i) 0

为什么呢?因为在排序A中:

如果某对(a_j, a_i)位于a_j < a_i and j != i-1,可以与x形成三角形

然后(a_i-1, a_i)必须与x形成一个三角形:

  
      
  1. a_i-1 + a_i > a_j + a_i > x

  2.   
  3. x + a_i-1 > x + a_j > a_i

  4.   
  5. x + a_i > x + a_i-1 > a_j

  6.   

因此,检查所有(a_i-1, a_i)就足够了,这是解决此问题的第一个核心思路。

现在我们有O(NlgN + N*(R-L+1)) = O(N*(R-L))算法。

对于原始的比赛问题,它仍然太慢,因为R-L+1大到10 ^ 18,所以我们需要另外一些技巧。

请注意,实际上通过三角形不等式,对于一对(a_i-1, a_i),我们确实可以找到一个范围x,它可以与此对形成三角形:

a_i-1 + a_i > x > a_i - a_i-1 (By above 1 & 2)

例如,(4,5)可以形成三角形,所有1&lt; x&lt; 9

因此,我们不会迭代x中的所有[L,R],而是尝试为每对x寻找范围,这可以在O(N)中完成,因为我们知道范围x中对O(1)的{​​{1}}。请注意x必须落在[L,R]范围内。

之后我们有O(N) x的范围/段,然后我们可以将它们联合起来,结果集的大小就是所需的答案。

联盟O(N)细分也可以在O(N)中轻松完成,我会将您留作家庭作业:)

结合两种技巧,算法为O(N lg N + N + N) = O(N lg N)