20210117 缀点成线

在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。

请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。

 

示例 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-it-is-a-straight-line
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public boolean checkStraightLine(int[][] coordinates) {

    }

思路:1. 坐标在同一条线上 其隔壁点的x y轴的差值必定相同(需要先对数组排序)

  2.斜率公式:k=(y1-y2)/(x1-x2) 

  用斜率公式时 斜率这样写k=(yi-y(i-1))/(xi-x(i-1)) 

for (int i=2;i<len;i++){
            if(k!=(coordinates[i][1]-coordinates[i-1][1])/(coordinates[i][0]-coordinates[i-1][0])){
                return false;
            }

这样不合理  而且每次都对比计算隔壁2个数组没必要的 可以把其中一个点固定计算斜率 如下就合理 即k=(yi-y0)/(xi-x0) 

for (int i=2;i<len;i++){
            if(k!=(coordinates[i][1]-coordinates[0][1])/(coordinates[i][0]-coordinates[0][0])){
                return false;
            }

因为xi-x(i-1)可能为0 还得考虑到被除数不为0 

由k=(yi-y0)/(xi-x0)  k=(y1-y0)/(x1-x0) 

得到(y1-y0)*(xi-x0)==(x1-x0)*(yi-y0)

 for (int i=2;i<len;i++){
            if((coordinates[1][1]-coordinates[0][1])*(coordinates[i][0]-coordinates[0][0])!=(coordinates[1][0]-coordinates[0][0])*(coordinates[i][1]-coordinates[0][1])){
                return false;
            }
        }

完整代码

 public static boolean checkStraightLine(int[][] coordinates) {
        int len =coordinates.length;
        for (int i=2;i<len;i++){
            if((coordinates[1][1]-coordinates[0][1])*(coordinates[i][0]-coordinates[0][0])!=(coordinates[1][0]-coordinates[0][0])*(coordinates[i][1]-coordinates[0][1])){
                return false;
            }
        }
        return true;
    }
原文地址:https://www.cnblogs.com/hbhb/p/14291777.html