Problem
Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane, return the maximum number of points that lie on the same straight line.
Constraints:
- 1 1 1 <= points.length <= 300 300 300
- points[i].length == 2 2 2
- − 1 0 4 -10^4 −104 <= xi, yi <= 1 0 4 10^4 104
- All the points are unique.
Algorithm
Enumerates the point and slope defining the straight line and determines if the point is on the straight line.
Code
class Solution:
def maxPoints(self, points: List[List[int]]) -> int:
sLen = len(points)
if sLen <= 2:
return sLen
def gcd(a, b):
if not b:
return a
return gcd(b, a % b)
slope = {}
ans = 0
for i in range(sLen):
for j in range(i):
kx = points[i][0] - points[j][0]
ky = points[i][1] - points[j][1]
if kx and ky:
kr = gcd(kx, ky)
kx = kx // kr
ky = ky // kr
elif not kx:
ky = 1
else:
kx = 1
index = str(points[i][0]) + "," + str(points[i][1]) + "," + str(kx) + "," + str(ky)
val = slope.get(index, 1)
if ans < val + 1:
ans = val + 1
slope.update({index:val+1})
return ans