给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。
示例 1:
输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
输出:true
示例 2:
输入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
输出:false
提示:
2 <= coordinates.length <= 1000
coordinates[i].length == 2
-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4
coordinates 中不含重复的点
首先,定义了一个函数getK
来计算两点之间的斜率。如果两点的x坐标相同,说明这两点之间的线段是垂直的,斜率不存在,函数返回一个特殊值(0,0)。否则,函数返回斜率的值和一个标记1,表示斜率存在。
然后,检查点集的大小。如果只有两个点,那么这两个点肯定可以构成一条直线,函数直接返回true。如果点集中有多于两个的点,那么函数计算第一个点和第二个点之间的斜率,并将其存储在k0
中。
接下来,函数遍历点集中剩余的每个点。对于每个点,计算它和第一个点之间的斜率,并检查这个斜率是否和k0
相等。如果有任何一个斜率不等于k0
,那么这些点就不能构成一条直线,函数返回false。
如果所有的点都被检查过,并且它们的斜率都等于k0
,那么这些点就可以构成一条直线,函数返回true。
/*
* @lc app=leetcode.cn id=1232 lang=cpp
*
* [1232] 缀点成线
*/
// @lc code=start
class Solution {
public:
pair<double, bool> getK(vector<int> a, vector<int> b) {
if (b[0] == a[0]) {
return make_pair(0, 0);
}
return make_pair((double)(b[1] - a[1]) / (double)(b[0] - a[0]), 1);
}
bool checkStraightLine(vector<vector<int>>& coordinates) {
if (coordinates.size() == 2) {
return true;
}
auto k0 = getK(coordinates[0], coordinates[1]);
for (auto it = coordinates.begin() + 2; it != coordinates.end(); it++) {
if (getK(coordinates[0], *it) != k0) {
return false;
}
}
return true;
}
};
// @lc code=end