算法日常——直线上最多的点

Posted by Maolong on Thursday, June 24, 2021

问题:

给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

 

示例 1:

输入:points = [[1,1],[2,2],[3,3]]
输出:3

示例 2:

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

 

提示:

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • points 中的所有点 互不相同
Related Topics
  • 几何
  • 数组
  • 哈希表
  • 数学

  • 👍 446
  • 👎 0
  • 题解:

    // @lc code=start
    func maxPoints(points [][]int) int {
    	l := len(points)
    
    	//判断3个点是否为一条直线
    	var ifLine = func(p1, p2, p3 []int) bool {
    		a1 := p1[0] - p2[0]
    		a2 := p1[1] - p2[1]
    		b1 := p2[0] - p3[0]
    		b2 := p2[1] - p3[1]
    
    		if a1 == 0 || b1 == 0 {
    			return a1 == b1 && p1[0] == p2[0] && p1[0] == p3[0]
    		}
    		if a2 == 0 || b2 == 0 {
    			return a2 == b2 && p1[1] == p2[1] && p1[1] == p3[1]
    		}
    		return a1*b2 == a2*b1
    	}
    
    	arr := make([][]*int, l)
    	for i := range arr {
    		arr[i] = make([]*int, l)
    	}
    
    	max := 1
    	for i := range points {
    		for j := i + 1; j < l; j++ {
    			if arr[i][j] != nil {
    				continue
    			}
    			tCount := 2
    			arr[i][j] = &tCount
    			for k := j + 1; k < l; k++ {
    				if ifLine(points[i], points[j], points[k]) {
    					tCount++
    					arr[i][k] = &tCount
    					arr[j][k] = &tCount
    				}
    			}
    			if tCount > max {
    				max = tCount
    			}
    		}
    	}
    
    	return max
    }
    
    // @lc code=end
    

    成绩:

    • 3333 cases passed (4 ms)
    • Your runtime beats 88.42 % of golang submissions
    • Your memory usage beats 90.53 % of golang submissions (2.7 MB)

    「真诚赞赏,手留余香」

    Maolong’s Blog

    真诚赞赏,手留余香

    使用微信扫描二维码完成支付