Algorithm to Check if All Points are On the Same Line

  • 时间:2020-09-09 13:16:32
  • 分类:网络文摘
  • 阅读:90 次

You are given an array coordinates, coordinates[i] = [x, y], where [x, y] represents the coordinate of a point. Check if these points make a straight line in the XY plane.

Input: coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
Output: true
points-on-a-line-1 Algorithm to Check if All Points are On the Same Line algorithms c / c++ geometry

Input: coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
Output: false
points-on-a-line-2 Algorithm to Check if All Points are On the Same Line algorithms c / c++ geometry

Constraints:
2 <= coordinates.length <= 1000
coordinates[i].length == 2
-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4
coordinates contains no duplicate point.

Hints:
If there’re only 2 points, return true.
Check if all other points lie on the line defined by the first 2 points.
Use cross product to check collinearity.

Cross Product to Check If Points are On a Line

If there are less than or equal to two points, we return true – as 1 or 2 points must be on the line. Then we use the first two points to compute the delta x and y offsets. Then checking from the third point, we can use the cross product to see if it is the same.

The following C++ implementation has O(N) linear runtime complexity.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
    bool checkStraightLine(vector<vector<int>>& coordinates) {
        if (coordinates.size() <= 2) return true;
        int dx = coordinates[0][0] - coordinates[1][0];
        int dy = coordinates[0][1] - coordinates[1][1];
        for (int i = 2; i < coordinates.size(); ++ i) {
            int dx1 = coordinates[0][0] - coordinates[i][0];
            int dy1 = coordinates[0][1] - coordinates[i][1];            
            if (dx1 * dy != dy1 * dx) return false;
        }
        return true;
    }
};
class Solution {
public:
    bool checkStraightLine(vector<vector<int>>& coordinates) {
        if (coordinates.size() <= 2) return true;
        int dx = coordinates[0][0] - coordinates[1][0];
        int dy = coordinates[0][1] - coordinates[1][1];
        for (int i = 2; i < coordinates.size(); ++ i) {
            int dx1 = coordinates[0][0] - coordinates[i][0];
            int dy1 = coordinates[0][1] - coordinates[i][1];            
            if (dx1 * dy != dy1 * dx) return false;
        }
        return true;
    }
};

The cross product (one of the most classic geometrygeometry algorithms) returns the perpendicular vector/line to the original line. If the cross product is the same, then the point must be on the same line.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
数图形的问题  一笔画问题  我们家的清明习俗  悲惨童年|小学作文  北京春节的习俗  快乐艺术节  我爱秋天的凄凉  赛龙舟比赛  端午节划龙舟作文  十里粽飘香 
评论列表
添加评论