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

來源:互聯網
上載者:User

0149_直線上最多的點數

題目描述

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

樣本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後碼農的學習與生活

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.