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
|