题解:
随便找两个点,求出两点相连的直线方程式,如果所有的点都满足就代表属于同一条直线上:
- 根据两点求方程式:(x1,y1) (x2,y2) =>
斜率式:k=(y2-y1)/(x2-x1) 直线方程 y-y1=k(x-x1)
两点式:(x-x1)/(x2-x1)=(y-y1)/(y2-y1) (这里直接用两点式了)- 将第三个点(x3,y3)代入两点式,然后判断是否满足等式
注意点:- 当斜率不存在时,即x1 = x2,直接判断每个点的y是否相等即可。
- 当斜率为0时,即y1 = y2,直接判断每个点的x是否相等即可。
- 当不为上述两种情况,直接将每个点代入两点式判断,看是否等式成立,但是要转换成double类判断。
代码:
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
/* 思路:
随便找两个点,求出两点相连的直线方程式,如果所有的点都满足就代表属于同一条直线上:
1. 根据两点求方程式:(x1,y1) (x2,y2) =>
斜率式:k=(y2-y1)/(x2-x1) 直线方程 y-y1=k(x-x1)
两点式:(x-x1)/(x2-x1)=(y-y1)/(y2-y1)
2. 将第三个点(x3,y3)代入两点式,然后判断是否满足等式
*/
int x1,y1;
x1 = coordinates[0][0]; y1 = coordinates[0][1];
int x2,y2;
x2 = coordinates[1][0]; y2 = coordinates[1][1];
if(y2 == y1)// 1. 斜率为0,保证y要相同
{
for(int i = 2; i < coordinates.size(); i++)
{
if(coordinates[i][1] != y2)
{
return false;
}
}
return true;
}
if(x2 == x1)// 2. 斜率不存在,保证x要相同
{
for(int i = 2; i < coordinates.size(); i++)
{
if(coordinates[i][0] != x2)
{
return false;
}
}
return true;
}
for(int i = 2; i < coordinates.size(); i++)// 3. 斜率既不为0,也存在,直接利用两点式判断
{
int x3,y3;
x3 = coordinates[i][0]; y3 = coordinates[i][1];
double t1 = x3-x1; double t2 = x2-x1; double t3 = y3-y1; double t4 = y2-y1;
if(t1/t2 != t3/t4)
{
return false;
}
}
return true;
}
};