LeetCode算法系列.0149_直線上最多的點數

0149_直線上最多的點數git

題目描述

給定一個二維平面,平面上有 n 個點,求最多有多少個點在同一條直線上github

示例1:算法

輸入: [[1,1],[2,2],[3,3]]
輸出: 3
解釋:
^
|
|        o
|     o
|  o
+------------->
0  1  2  3  4

示例2:數據結構

輸入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
輸出: 4
解釋:
^
|
|  o
|     o        o
|        o
|  o        o
+------------------->
0  1  2  3  4  5  6

算法

func maxPoints(points []Point) int {
    n := len(points)
    // diffMap 用來過濾掉相同的點,並記錄他們的個數
    //map特色: point1和point2,不是同一個對象,可是X和Y屬性值相同,則key相等
    diffMap := make(map[Point]int, n)

    for i := 0; i < n; i++ {
        diffMap[points[i]]++
    }

    size := len(diffMap)

    // 不超過 2 個不一樣的點
    // 則,全部的點都在同一條直線上
    if size <= 2 {
        return n
    }

    max := 0
    // 存在相同的點,
    // 則,提取全部不一樣的點,能夠大大減小後面 3 個嵌套的 for 循環的次數
    if size < n {
        points = make([]Point, 0, size)
        for p := range diffMap {
            points = append(points, p)
        }
    }

    for i := 0; i < size-1; i++ {
        for j := i + 1; j < size; j++ {
            count := 0
            // 全部的點,都要檢查,是否與 i, j 共線
            for k := 0; k < size; k++ {
                if isSameLine(points[i], points[j], points[k]) {
                    count += diffMap[points[k]]
                }
            }
            if max < count {
                max = count
            }
        }
    }

    return max
}

func isSameLine(p1, p2, p3 Point) bool {
    //高中數學中,判斷第三個點在某條線上
    //(p3.Y-p1.Y)/(p3.X-p1.X) == (p2.Y-p1.Y)/(p2.X-p1.X),則p3在p1-p2線上
    return (p3.X-p1.X)*(p2.Y-p1.Y) == (p2.X-p1.X)*(p3.Y-p1.Y)
}

我的思路

1. 任意不一樣的兩點肯定一條直線,遍歷全部點是否在該線上,並計數
2. []Point中有重複的點,因此首先得利用map去重並分別記錄點的個數,能夠大大減小多層for循環中判斷三點是否同一直線的次數,
3. 不一樣點不超過2個,則全部點在同一條線上

總結

  • 筆者前期採用的思路是,公式 y=ax+b,斜率a相等,且b相等,則是同一直線,而後以(a,b)爲key,只需遍歷一遍[]Point,一層for循環,看似簡單,可是寫到後面,發現代碼很是的複雜,且存在a爲0或b爲0等各類特殊狀況,數據結構複雜,a爲float64,有精度問題
  • 目前版本算法,直接使用3層for循環,看似複雜度很高,可是能夠先去重,減小for次數,以及代碼直白簡單,易懂的特色
  • 好的代碼,應該思路清晰,讀者容易看懂,與君共勉

GitHub

  • 項目源碼在這裏
  • 筆者會一直維護該項目,對leetcode中的算法題進行解決,並寫下本身的思路和看法,致力於人人都能看懂的算法

我的公衆號

  • 喜歡的朋友能夠關注,謝謝支持
  • 記錄90後碼農的學習與生活

image

相關文章
相關標籤/搜索