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

2023-05-16

链接

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;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐