149. 直线上最多的点数

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

输入: [[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

  1. //采用查找表解决,key为两点直线的斜率,value为相同直线的点的个数
  2. func maxPoints(points [][]int) int {
  3. //以i点为枢纽,找到与i点组成的直线的斜率相同的点
  4. resMax := 0 //返回值
  5. for i:=0;i<len(points);i++{
  6. //建立一个key为两点斜率,可能为浮点数,所以才要float64,value为相同斜率点的个数
  7. hash := make(map[float64]int)
  8. for j:=0;j<len(points);j++{
  9. if i != j{ //不能是同一个点组成直线
  10. hash[lineSlope(points[i],points[j])]++
  11. }
  12. }
  13. for _,v := range hash{
  14. if v > resMax{ //遍历hash表,同一直线最多的点数
  15. resMax = v
  16. }
  17. }
  18. }
  19. return resMax + 1 //因为hash表没有统计点i它自身,所以需要加一
  20. }
  21. func lineSlope(a,b []int)float64{
  22. return float64(a[1]-b[1]) / float64(a[0]-b[0]) //相当于(ay-by) / (ax-bx)
  23. }