链接
https://leetcode-cn.com/problems/check-if-it-is-a-straight-line/
耗时
解题:21 min
题解:11 min
题意
在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。
请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。
思路
观察可以发现:只要所有点坐标 p(xi,yi) 的差值 x k 1 = x i + 1 − x i xk1=x_{i+1}-x_{i} xk1=xi+1−xi, x k = x i − x i − 1 xk=x_i-x_{i-1} xk=xi−xi−1 和 y k 1 = y i + 1 − y i yk1=y_{i+1}-y_{i} yk1=yi+1−yi, y k = y i − y i − 1 yk=y_i-y_{i-1} yk=yi−yi−1 的倍率相同( x k 1 x k = = y k 1 y k ⇒ x k 1 ∗ y k = = y k 1 ∗ x k \frac{xk1}{xk} == \frac{yk1}{yk} \Rightarrow xk1*yk == yk1*xk xkxk1==ykyk1⇒xk1∗yk==yk1∗xk)即在同一条直线上。
时间复杂度: O ( n ) O(n) O(n)
AC代码
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
int n = coordinates.size();
if(n <= 2) return true;
int xk = coordinates[1][0] - coordinates[0][0];
int yk = coordinates[1][1] - coordinates[0][1];
for(int i = 2; i < n; ++i) {
int xk1 = coordinates[i][0] - coordinates[i-1][0];
int yk1 = coordinates[i][1] - coordinates[i-1][1];
if((xk1*yk) != (yk1*xk)) {
return false;
}
}
return true;
}
};