题目链接:
分析:这是一个基本的数学问题,将简单的数学知识---直线的表达式和编程结合了起来。
算法思路:为了验证所给的点是否能构成一条直线,最直观的方法是,先用两个点确定一条直线,再去判断其余的点是否在这条直线上。
直线存在多种表示方法,一般式、点斜式、两点式。采用哪一种更好呢?这要根据题目做一个综合的考虑,在所有的直线中,可能会出现斜率不存在的(也就是平行于y轴),这是如果直线表达式中出现了除法就难以计算,还需要重新分其它的情况。因此建议选择两点式
(x-x1)(y-y2)=(x-x2)(y-y1)
可以观察到,两点式的左右两侧都是乘法,不会出现除0这种特殊现象。因此选择两点式。
我们开始考虑该题目的特殊情况,如果仅有两个点,那么一定可以组成直线;如果有三个及以上,那么我们进行判断,选择前两个点作为两点式里面的固定参数,将剩余的点以x,y的形式分别带入,如果不满足等式,说明这个点不在固定两点所在的直线上,返回false;如果遍历结束,那说明全部满足条件,则返回true。
参考代码:
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
if(coordinates.size()==2)//两点一定构成一条直线
return true;
for(int i=2;i<coordinates.size();++i){
int a=(coordinates[i][0]-coordinates[0][0])*(coordinates[i][1]-coordinates[1][1]);//两点式的一侧
int b=(coordinates[i][0]-coordinates[1][0])*(coordinates[i][1]-coordinates[0][1]);//两点式的另一侧
if(a!=b)//不相等则不满足条件
return false;
}
return true;
}
};