149. 直线上最多的点数

https://leetcode-cn.com/problems/max-points-on-a-line/

题目描述

示例 1:

![](https://assets.leetcode.com/uploads/2021/02/25/plane1.jpg)

输入: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 中的所有点 互不相同

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-points-on-a-line 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法 2: 哈希表

思路

枚举直线无法避免,但是计算直线上的点这一步可以优化,思路如下:

  • 先确定一个点,计算当前点与剩余其他点的斜率

  • 用哈希表记录这个过程中所有出现过的斜率以及出现次数

  • 因为斜率一样的点就在同一条直线上,所以统计斜率出现次数就能知道该直线上有多少个点了

  • 难点在于斜率的记录方式,直接计算会出现精度问题,所以采取分子分母元祖的记录方式,如,slope = y / x 记录为字符串 'y/x',记录前还需要对分式进行约分。

复杂度分析

  • 时间复杂度:$O(N^2*logm)$,枚举直线的时间是 $O(N^2)$,计算 gcd 的时间是 $O(logm)$,m 是点的最大差值。

  • 空间复杂度:$O(N)$。

代码

JavaScript Code

更多题解可以访问:https://github.com/suukii/91-days-algorithm

Last updated

Was this helpful?