很明显,我可以用蛮力,一个接一个地选择所有的三胞胎,并检查它们是否构成直角三角形。
但还有什么比这更好的方法呢?我想不出什么。
编辑:既然你们中的一些人指出了另一个看起来与这个问题类似的问题,我就仔细研究了答案,但仍然不知道如何用这些答案来解决这个问题。
最佳答案
这将在O(n^2Log(n))
中工作。
算法:
创建一个2d数组,其中Slope
是Slope[i,j]
和coordinate[i]
之间的斜率向量。
现在,要使coordinate[j]
成为直角三角形的关节(见注2),coordinate[i]
中应该有两个相互正交的斜率,即它们的点积为0。
如果Slope[i,....]
Slope[i,j] = (a,b)
,则必须在(in vector form)
中查找(b,-a)
或(-b,a)
。
若要优化搜索,请将数组Slope[i,....]
排序为Slope[i,...]
或a
。
排序将花费b
时间。
现在,对于任何O(nlogn)
,执行二进制搜索以在数组中查找Slope[i,j]
和(b,-a)
。
对所有(-b,a)
斜率的二进制搜索将花费n
时间。
因此,总的时间复杂度:
= Calculate slope between all points + Sort the slopes + BinarySearch
= O(n*(n+nlogn+nlogn)) = O(n^2log(n))
注:
确保将坡度向量规格化,即:
O(nlogn)
直角三角形的关节:两条正交边之间的公共坐标。