很明显,我可以用蛮力,一个接一个地选择所有的三胞胎,并检查它们是否构成直角三角形。
但还有什么比这更好的方法呢?我想不出什么。
编辑:既然你们中的一些人指出了另一个看起来与这个问题类似的问题,我就仔细研究了答案,但仍然不知道如何用这些答案来解决这个问题。

最佳答案

这将在O(n^2Log(n))中工作。
算法:
创建一个2d数组,其中SlopeSlope[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)
直角三角形的关节:两条正交边之间的公共坐标。

07-25 20:53