classSolution{ funmaxPoints(points: Array<IntArray>): Int { if (points.isEmpty()) return0 // 一个点和两个点都是在同一个直线上 if (points.size < 3) return points.size // 所有的点都是同一个点,表示所有的点都在同一条直线上 if (points.distinctBy { "${it[0]},${it[1]}" }.size == 1) return points.size
val n = points.size var maxPoints = 0 for (i in0 until n) { val x1 = points[i][0] val y1 = points[i][1] for (j in i + 1 until n) { val x2 = points[j][0] val y2 = points[j][1] // 同一个点确立不了直线,直接跳过,之后再确立了直线的情况,会考察到跳过的这个点 if (x1 == x2 && y1 == y2) continue // (x1,y1)和(x2,y2)确立一条直线 val line = Line(x1, y1, x2, y2) // 统计所有其他的点,是否在这条线上 var tmpMax = 2 for (k in0 until n) { if (k == i || k == j) continue val x3 = points[k][0] val y3 = points[k][1] if (line.isOnTheLine(x3, y3)) { // 发现有一个点在线上,计数 tmpMax++ } } if (tmpMax > maxPoints) { maxPoints = tmpMax } } } return maxPoints }
/** * 求[a]和[b]的最大公约数 * 使用辗转相除法 */ privatefungreatestCommonDivisor(a: Int, b: Int): Int { if (a == b) return a var big = if (a > b) a else b var small = if (a < b) a else b while (small != 0) { val remainder = big % small big = small small = remainder } return big } } }