我显然可以通过蛮力,通过逐个选择所有三胞胎并检查它们是否形成直角三角形来做到这一点。 但是什么可能是更优化的方式?我无法想到任何事情。
编辑:由于你们中的一些人指出了另一个看似与此问题类似的问题,我通过了答案,我仍然无法弄清楚如何使用这些答案来解决这个问题。
答案 0 :(得分:0)
这适用于O(n^2Log(n))
。
Algo :
创建二维数组 Slope
,其中Slope[i,j]
是coordinate[i]
和coordinate[j]
之间的斜率向量。
现在,要使coordinate[i]
成为直角三角形的关节(参见注释2),{{1}应该有两个斜率它们彼此正交,即它们的点积为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
时间。
所以,总时间复杂度:
O(nlogn)
注意:
确保规范化斜率向量,即:
= Calculate slope between all points + Sort the slopes + BinarySearch
= O(n*(n+nlogn+nlogn)) = O(n^2log(n))
直角三角形的关节:两个正交边之间的公共坐标。