給定一個二維平面,平面上有 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個,則全部點在同一條線上