O(n3)O(n^3)O(n3) 的解法是个人都会,所以我来教大家一个 O(n2logn)O(n^2\log n)O(n2logn) 的解法。
思考一下如果一个三角形是直角三角形,那它得满足什么?
1. 有直角。
2. 符合勾股定理(即存在两边的平方和等于第三边)。
性质 2 想不出来怎么优化,所以我考虑性质 1。
注意到在平面直角坐标系内,如果一个角是直角,它的两边的解析式分别为 y=k1x+b1,y=k2x+b2(k1,k2≠0)y=k_1x+b_1,y=k_2x+b_2(k_1,k_2\not= 0)y=k1 x+b1 ,y=k2 x+b2 (k1 ,k2 =0),则有 k1×k2=−1k_1\times k_2=-1k1 ×k2 =−1。如果两边解析式分别为 y=b1y=b_1y=b1 和 x=b2x=b_2x=b2 ,也可以构成直角。
我们可以先预处理出每个边的解析式的 kkk 值,然后枚举每个顶点, 计算它们作为直角顶点的个数,这个个数就是这个图内直角三角形的个数。
时间复杂度:O(n2logn)O(n^2\log n)O(n2logn)。