2021-09-03:直线上最多的点数。给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。力扣149。
福大大 答案2021-09-03:
具体见代码。
代码用golang编写。代码如下:
package main import "fmt" func main() { //points := [][]int{{1, 1}, {2, 2}, {3, 3}} points := [][]int{{1, 1}, {3, 2}, {5, 3}, {4, 1}, {2, 3}, {1, 4}} ret := maxPoints(points) fmt.Println(ret) } // [ // [1,3] // [4,9] // [5,7] // ] func maxPoints(points [][]int) int { if points == nil { return 0 } if len(points) <= 2 { return len(points) } // key = 3 // value = {7 , 10} -> 斜率为3/7的点 有10个 // {5, 15} -> 斜率为3/5的点 有15个 map0 := make(map[int]map[int]int) result := 0 for i := 0; i < len(points); i++ { map0 = make(map[int]map[int]int) samePosition := 1 sameX := 0 sameY := 0 line := 0 for j := i + 1; j < len(points); j++ { // i号点,和j号点,的斜率关系 x := points[j][0] - points[i][0] y := points[j][1] - points[i][1] if x == 0 && y == 0 { samePosition++ } else if x == 0 { sameX++ } else if y == 0 { sameY++ } else { // 普通斜率 gcd0 := gcd(x, y) x /= gcd0 y /= gcd0 // x / y if _, ok := map0[x]; !ok { map0[x] = make(map[int]int) } if _, ok := map0[x][y]; !ok { map0[x][y] = 0 } map0[x][y] = map0[x][y] + 1 line = getMax(line, map0[x][y]) } } result = getMax(result, getMax(getMax(sameX, sameY), line)+samePosition) } return result } // 保证初始调用的时候,a和b不等于0 // O(1) func gcd(a int, b int) int { if b == 0 { return a } else { return gcd(b, a%b) } } func getMax(a int, b int) int { if a > b { return a } else { return b } }
执行结果如下: