12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package main
- // Tuple3Int ...
- type Tuple3Int struct {
- _1 int
- _2 int
- _3 int
- }
- /**
- * Definition for a point.
- * type Point struct {
- * X int
- * Y int
- * }
- */
- func maxPoints(points []Point) (maxPts int) {
- xAxisDir := make(map[int]int)
- yAxisDir := make(map[int]int)
- weight := make(map[Point]int)
- for i := range points {
- xAxisDir[points[i].X]++
- yAxisDir[points[i].Y]++
- weight[points[i]]++
- }
- lines := make(map[Tuple3Int]map[Point]int)
- for i := 0; i < len(points); i++ {
- for j := i + 1; j < len(points); j++ {
- if points[i].X != points[j].X && points[i].Y != points[j].Y {
- pair := getParamsOfLine(points[i], points[j])
- if _, ok := lines[pair]; !ok {
- lines[pair] = make(map[Point]int)
- }
- if _, ok := lines[pair][points[i]]; !ok {
- lines[pair][points[i]] += weight[points[i]]
- }
- if _, ok := lines[pair][points[j]]; !ok {
- lines[pair][points[j]] += weight[points[j]]
- }
- }
- }
- }
- for _, v := range xAxisDir {
- if v > maxPts {
- maxPts = v
- }
- }
- for _, v := range yAxisDir {
- if v > maxPts {
- maxPts = v
- }
- }
- for _, m := range lines {
- pts := 0
- for _, v := range m {
- pts += v
- }
- if pts > maxPts {
- maxPts = pts
- }
- }
- return
- }
- // Caculate params of given line ay = bx + c, return Tuple3Int{a, b, c}
- func getParamsOfLine(p1, p2 Point) Tuple3Int {
- y, x := p2.Y-p1.Y, p2.X-p1.X
- a, b := x, y
- for b != 0 {
- a, b = b, a%b
- }
- return Tuple3Int{x / a, y / a, (x*p1.Y - y*p1.X) / a}
- }
- // func main() {
- // println(maxPoints(
- // []Point{{1, 1}, {2, 2}, {1, 1}}))
- // println(maxPoints(
- // []Point{{1, 1}, {2, 2}, {3, 3}}))
- // println(maxPoints(
- // []Point{{1, 1}, {3, 2}, {5, 3}, {4, 1}, {2, 3}, {1, 4}}))
- // }
|