【leetcode】1232. 缀点成线(check-if-it-is-a-straight-line)(数学)[简单]

链接

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+1xi, x k = x i − x i − 1 xk=x_i-x_{i-1} xk=xixi1 y k 1 = y i + 1 − y i yk1=y_{i+1}-y_{i} yk1=yi+1yi, y k = y i − y i − 1 yk=y_i-y_{i-1} yk=yiyi1 的倍率相同( 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==ykyk1xk1yk==yk1xk)即在同一条直线上。

时间复杂度: 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;
    }
};

你可能感兴趣的:(leetcode,题解,数学,leetcode,数学)