package LeetCode_149
/**
* 149. Max Points on a Line
* https://leetcode.com/problems/max-points-on-a-line/
*
* Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
Example 1:
Input: [[1,1],[2,2],[3,3]]
Output: 3
Explanation:
^
|
| o
| o
| o
+------------->
0 1 2 3 4
* */
class Solution {
/*
* solution: math, get slope of two point: (y2-y1)/(x2-x1)
* Time complexity:O(n^2), Space complexity:O(n)
* */
fun maxPoints(points: Array<IntArray>): Int {
var res = 0
if (points == null || points.isEmpty()) {
return 0
}
if (points.size <= 2) {
return points.size
}
val n = points.size
//val map = HashMap<String, Int>()
val map = HashMap<Double, Int>()
for (i in 0 until n) {
map.clear()
//key is slope of a point
//value is the count of same slope
var duplicate = 0
var sameX = 0
for (j in (i+1) until n) {
if (i == j) {
continue
}
val deltaX = points[j][0] - points[i][0]
val deltaY = points[j][1] - points[i][1]
//the point overlapping
if (deltaX == 0 && deltaY == 0) {
duplicate++
//avoid case:[[1,1],[1,1],[1,1]]
//continue
}
if (points[j][0] == points[i][0]) {
sameX++
continue
}
val slope = (points[j][1] - points[i][1]).toDouble() / (points[j][0] - points[i][0]).toDouble()
if (map.contains(slope)) {
map.put(slope, map.get(slope)!! + 1)
} else {
map.put(slope, 2)
}
res = Math.max(res, map.get(slope)!! + duplicate)
}
res = Math.max(res, sameX)
}
return res
}
//return the greatest common divisor
/*private fun gcd(a: Int, b: Int): Int {
if (b == 0) {
return a
}
return gcd(b, a % b)
}*/
}