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
    }
}

执行结果如下:
图片


左神java代码