Given N point on a 2D plane as pair of (x, y) co-ordinates, we need to find maximum number of point which lie on the same line.

Examples:

Input : points[] = {-1, 1}, {0, 0}, {1, 1}, {2, 2}, {3, 3}, {3, 4} Output : 4 Then maximum number of point which lie on same line are 4, those point are {0, 0}, {1, 1}, {2, 2}, {3, 3}

We can solve above problem by following approach – For each point p, calculate its slope with other points and use a map to record how many points have same slope, by which we can find out how many points are on same line with p as their one point. For each point keep doing the same thing and update the maximum number of point count found so far.

Some things to note in implementation are:

1) if two point are (x1, y1) and (x2, y2) then their slope will be (y2 – y1) / (x2 – x1) which can be a double value and can cause precision problems. To get rid of the precision problems, we treat slope as pair ((y2 – y1), (x2 – x1)) instead of ratio and reduce pair by their gcd before inserting into map. In below code points which are vertical or repeated are treated separately.

2) If we use unordered_map in c++ or HashMap in Java for storing the slope pair, then total time complexity of solution will be O(n^2)

## C++

`/* C/C++ program to find maximum number of point ` `which lie on same line */` `#include <bits/stdc++.h> ` `#include <boost/functional/hash.hpp> ` ` ` `using` `namespace` `std; ` ` ` `// method to find maximum colinear point ` `int` `maxPointOnSameLine(vector< pair<` `int` `, ` `int` `> > points) ` `{ ` ` ` `int` `N = points.size(); ` ` ` `if` `(N < 2) ` ` ` `return` `N; ` ` ` ` ` `int` `maxPoint = 0; ` ` ` `int` `curMax, overlapPoints, verticalPoints; ` ` ` ` ` `// here since we are using unordered_map ` ` ` `// which is based on hash function ` ` ` `//But by default we don't have hash function for pairs ` ` ` `//so we'll use hash function defined in Boost library ` ` ` `unordered_map<pair<` `int` `, ` `int` `>, ` `int` `,boost:: ` ` ` `hash<pair<` `int` `, ` `int` `> > > slopeMap; ` ` ` ` ` `// looping for each point ` ` ` `for` `(` `int` `i = 0; i < N; i++) ` ` ` `{ ` ` ` `curMax = overlapPoints = verticalPoints = 0; ` ` ` ` ` `// looping from i + 1 to ignore same pair again ` ` ` `for` `(` `int` `j = i + 1; j < N; j++) ` ` ` `{ ` ` ` `// If both point are equal then just ` ` ` `// increase overlapPoint count ` ` ` `if` `(points[i] == points[j]) ` ` ` `overlapPoints++; ` ` ` ` ` `// If x co-ordinate is same, then both ` ` ` `// point are vertical to each other ` ` ` `else` `if` `(points[i].first == points[j].first) ` ` ` `verticalPoints++; ` ` ` ` ` `else` ` ` `{ ` ` ` `int` `yDif = points[j].second - points[i].second; ` ` ` `int` `xDif = points[j].first - points[i].first; ` ` ` `int` `g = __gcd(xDif, yDif); ` ` ` ` ` `// reducing the difference by their gcd ` ` ` `yDif /= g; ` ` ` `xDif /= g; ` ` ` ` ` `// increasing the frequency of current slope ` ` ` `// in map ` ` ` `slopeMap[make_pair(yDif, xDif)]++; ` ` ` `curMax = max(curMax, slopeMap[make_pair(yDif, xDif)]); ` ` ` `} ` ` ` ` ` `curMax = max(curMax, verticalPoints); ` ` ` `} ` ` ` ` ` `// updating global maximum by current point's maximum ` ` ` `maxPoint = max(maxPoint, curMax + overlapPoints + 1); ` ` ` ` ` `// printf("maximum colinear point ` ` ` `// which contains current point ` ` ` `// are : %d\n", curMax + overlapPoints + 1); ` ` ` `slopeMap.clear(); ` ` ` `} ` ` ` ` ` `return` `maxPoint; ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `const` `int` `N = 6; ` ` ` `int` `arr[N][2] = {{-1, 1}, {0, 0}, {1, 1}, {2, 2}, ` ` ` `{3, 3}, {3, 4}}; ` ` ` ` ` `vector< pair<` `int` `, ` `int` `> > points; ` ` ` `for` `(` `int` `i = 0; i < N; i++) ` ` ` `points.push_back(make_pair(arr[i][0], arr[i][1])); ` ` ` ` ` `cout << maxPointOnSameLine(points) << endl; ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Python3

`def` `maxPoints(points): ` ` ` `n` `=` `len` `(points) ` ` ` ` ` `# upto two points all points will be part of the line ` ` ` `if` `n<` `3` `: ` ` ` `return` `n ` ` ` ` ` `max_val` `=` `0` ` ` ` ` `# looping for each point ` ` ` `for` `i ` `in` `points: ` ` ` ` ` `# Creating a dictionary for every new ` ` ` `# point to save memory ` ` ` `d ` `=` `{} ` ` ` `dups ` `=` `0` ` ` `cur_max ` `=` `0` ` ` ` ` `# pairing with all other points ` ` ` `for` `j ` `in` `points: ` ` ` `if` `i!` `=` `j: ` ` ` `if` `j[` `0` `]` `=` `=` `i[` `0` `]: ` `#vertical line ` ` ` `slope` `=` `'inf'` ` ` `else` `: ` ` ` `slope` `=` `float` `(j[` `1` `]` `-` `i[` `1` `])` `/` `float` `(j[` `0` `]` `-` `i[` `0` `]) ` ` ` ` ` `# Increasing the frequency of slope and ` ` ` `# updating cur_max for current point(i) ` ` ` `d[slope] ` `=` `d.get(slope,` `0` `)` `+` `1` ` ` `cur_max` `=` `max` `(cur_max, d[slope]) ` ` ` ` ` `# if both points are equal same increase ` ` ` `# duplicates count. ` ` ` `# Please note that this will also increment ` ` ` `# when we map it with itself. ` ` ` `# we still do it because we will not have to ` ` ` `# add the extra one at the end. ` ` ` `else` `: ` ` ` `dups` `+` `=` `1` ` ` ` ` `max_val` `=` `max` `(max_val, cur_max` `+` `dups) ` ` ` ` ` `return` `max_val ` ` ` `# Driver code ` `points ` `=` `[(` `-` `1` `, ` `1` `), (` `0` `, ` `0` `), (` `1` `, ` `1` `), (` `2` `, ` `2` `), (` `3` `, ` `3` `), (` `3` `, ` `4` `)] ` `print` `(maxPoints(points)) ` |

*chevron_right*

*filter_none*

This article is contributed by **Utkarsh Trivedi**. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Check whether two points (x1, y1) and (x2, y2) lie on same side of a given line or not
- Count of obtuse angles in a circle with 'k' equidistant points between 2 given points
- Count distinct points visited on the number line
- Number of Integral Points between Two Points
- Prime points (Points that split a number into two primes)
- Minimum number of points to be removed to get remaining points on one side of axis
- Ways to choose three points with distance between the most distant points <= L
- Steps required to visit M points in order on a circular ring of N points
- Find the point on X-axis from given N points having least Sum of Distances from all other points
- Represent a given set of points by the best possible straight line
- Program to find line passing through 2 Points
- Number of horizontal or vertical line segments to connect 3 points
- Number of ordered points pair satisfying line equation
- Find X and Y intercepts of a line passing through the given points
- Check whether a straight line can be formed using N co-ordinate points
- Find points at a given distance on a line of given slope
- Print level order traversal line by line | Set 1
- Level order traversal line by line | Set 2 (Using Two Queues)
- Slope of the line parallel to the line with the given slope
- Equation of straight line passing through a given point which bisects it into two equal line segments