大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可。其实还有其他方法可以做,我个人感觉用斜率法最简单。
有几点需要注意:
1. 在计算斜率的时候,如果多个点处于一个与横坐标轴垂直的线上,那么除以 000 的时候会爆RE\color{royalblue}\text{RE}RE 需要特判一下。
2. 存储的时候需要使用 double 类型。
3. 在选取三元组的时候,需要保证不重复不遗漏。不会出现一个点被多次选中,相同的组合被多次计算的情况。
4. 斜率法:
对于三个点 (x1,y1)(x_1, y_1)(x1 ,y1 ), (x2,y2)(x_2, y_2)(x2 ,y2 ), 和 (x3,y3)(x_3, y_3)(x3 ,y3 ),计算任意两点之间的斜率。如果这三个斜率相等,则这三个点共线。但是要注意的是,当两个点的 x 坐标相等时,斜率会无穷大,因此在实际计算中需要特别处理这种情况。
dydx=y2−y1x2−x1\frac{dy}{dx} = \frac{{y_2 - y_1}}{{x_2 - x_1}} dxdy =x2 −x1 y2 −y1
2. 向量法:
设想将三个点看作向量,即 P1P2⃗\vec{P_1P_2}P1 P2 和 P1P3⃗\vec{P_1P_3}P1 P3 。如果这两个向量是平行的,则三个点共线。你可以通过计算这两个向量的叉积来验证它们是否平行。如果叉积为零,则两个向量平行,即三个点共线。
Cross Product=P1P2⃗×P1P3⃗=(x2−x1)(y3−y1)−(y2−y1)(x3−x1)\text{Cross Product} = \vec{P_1P_2} \times \vec{P_1P_3} = (x_2 - x_1)(y_3 - y_1) - (y_2 - y_1)(x_3 - x_1) Cross Product=P1 P2 ×P1 P3 =(x2 −x1 )(y3 −y1 )−(y2 −y1 )(x3 −x1 )
3. 行列式法:
将三个点的坐标表示成矩阵形式,然后计算这个矩阵的行列式。如果行列式的值为零,则表示这三个点共线。有关行列式的计算可以自行在搜索引擎上搜索。
Determinant=∣x1y11x2y21x3y31∣=0\text{Determinant} = \begin{vmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \end{vmatrix} = 0 Determinant= x1 x2 x3 y1 y2 y3 111 =0
4. 面积法:
如果三个点 A(x1,y1)A(x_1, y_1)A(x1 ,y1 ), B(x2,y2)B(x_2, y_2)B(x2 ,y2 ), 和 C(x3,y3)C(x_3, y_3)C(x3 ,y3 ) 共线,则它们构成的三角形的面积为零。
Sarea=12∣x1(y2−y3)+x2(y3−y1)+x3(y1−y2)∣S_{area} = \frac{1}{2} |x_1(y_2 - y_3) + x_2(y_3 - y_1) + x_3(y_1 - y_2)| Sarea =21 ∣x1 (y2 −y3 )+x2 (y3 −y1 )+x3 (y1 −y2 )∣
以上所有代码的时间复杂度为 O(n3)O(n^3)O(n3),其中 nnn 是点的数量。但对于本题而言,没有问题不会超时。