题目链接:https://leetcode-cn.com/problems/check-if-it-is-a-straight-line/
题目
在一个 XY 坐标系中有一些点,我们用数组 coordinates
来分别记录它们的坐标,其中 coordinates[i] = [x, y]
表示横坐标为 x
、纵坐标为 y
的点。
请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true
,否则请返回 false
。
分析
这种题目居然WA了一次。。。
依题意,判断给出的所有点是否都在同一直线上,我们只需要按照前两点的坐标计算斜率和截距,得到由前两点确定的直线方程,将后面的坐标套入此方程即可。
这题的特殊情况有两种:
- 一共只给出两个点。两点确定一条直线,直接返回true。
- 所有点垂直于x轴。这样的直线没有斜率,需要单独拎出来讨论(第一次提交就挂在这里了)。
直接放代码了。
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
// ax1 + b = y1; ax2 + b = y2
// a(x1 - x2) = y1 - y2
// a = (y1 - y2) / (x1 - x2)
// b = y1 - ax1
if (coordinates.size() == 2)
return true;
bool vertical = false; // 垂直,无斜率
float a = 0, b = 0;
if (coordinates[0][0] == coordinates[1][0])
vertical = true;
else
{
a = (float)(coordinates[0][1] - coordinates[1][1]) /
(coordinates[0][0] - coordinates[1][0]);
b = coordinates[0][1] - a * coordinates[0][0];
}
if (vertical)
{
for (int i = 2; i < coordinates.size(); ++i)
if (coordinates[i][0] != coordinates[0][0])
return false;
}
else
{
for (int i = 2; i < coordinates.size(); ++i)
{
if (a * coordinates[i][0] + b != coordinates[i][1])
return false;
}
}
return true;
}
};