让整数x,y,z为三角形的三个边,给出三个整数X,Y,Z分别代表三个边的值的范围。例如,当X = 3时,x可以是1或2或3。找到可以由x,y,z构造的有效三角形的数量。
注意:
a. 3,4,5 and 3,5,4 are two different triangles.
b. x,y,z can be reach 10^9. So traversing algorithm is unreasonable.
示例:
X = 2
Y = 3
Z = 3
Answer: 9
说明:我们在这里有9
个可能的三角形:(1,1,1) (1,2,2) (1,3,3) (2,1,2) (2,2,1) (2,2,2) (2,2,3) (2,3,2) (2,3,3)
答案 0 :(得分:0)
为简单起见,假设x <= y。
所以y = x + k,且k> =0。对于要保持的三角形不等式,x + z> = y。所以x + z> = x + k。所以z> = k。
所以z = k + h,且h> = 0。
现在我们有x + z => y,而y + z> = x。我们只需要检查x + y> = z,即x + x + k> = k + h。所以2x> = h。
For every possible x:
for every possible y >= x:
answer += 2x + 1 // (k + 0, k + 1 ... k + 2x)
但是这仍然是O(n ^ 2),因此我们需要尝试删除第二个循环。您可能已经注意到,我们没有使用y的任何信息来求和,因为我们总是回答+ = 2x +1而不管y。因此我们可以将其减少为:
For every possible x:
answer += (2x + 1) * (max y - x + 1)
这只是一般性的想法,不会解决整个问题,而只是提示如何进行。请注意,这里我们没有检查任何边界,每个可能的x都意味着x不应超过max y值,并且也没有检查z是否可以达到这些值。当(y-x)+ 2x> max z时,我们需要减少计数,但是可以固定。然后,您可以对y
答案 1 :(得分:-1)
我建议在这里使用强力方法,并建议您通过解决此问题来降低其复杂性。如果您可以分享自己已经取得的一些进步,将会非常有帮助。
据我了解,我们获得了x,y和z取值的上限/上限。
所以
我建议您可以输入以下内容:
count = 0
for every value x in arr_x:
for every value y in arr_y:
for every value z in arr_z:
if triangle inequality is satisfied:
increment count by 1
return count