友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

149. 直线上最多的点数

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

示例 1:

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

示例 2:

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

思路分析

先确定两个点,然后再选一个点,计算三个点的斜率来查看是否在同一条直线。

\[(y_1 - y_2) / (x_1 - x_2) = (y_2 - y_3)/(x_2 - x_3)\]

等价于

\[(x_2 - x_3)* (y_1 - y_2) = (x_1 - x_2) * (y_2 - y_3)\]

这样就避免计算除法。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-06-07 21:55:30
 */
public int maxPoints(int[][] points) {
  int length = points.length;
  int result = 1;
  for (int i = 0; i < length; i++) {
    int[] a = points[i];
    for (int j = i + 1; j < length; j++) {
      int[] b = points[j];
      int cnt = 2;
      for (int k = j + 1; k < length; k++) {
        int[] c = points[k];
        int m1 = (b[0] - c[0]) * (a[1] - b[1]);
        int m2 = (a[0] - b[0]) * (b[1] - c[1]);
        if (m1 == m2) {
          cnt++;
        }
      }
      result = Math.max(result, cnt);
    }
  }
  return result;
}

参考资料