在一个 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; }