题目链接
题目简介
给你一个数组points
,其中 points[i] = [xi, yi]
表示 X-Y
平面上的一个点。求最多有多少个点在同一条直线上。
示例 1:
输入:points = [[1,1],[2,2],[3,3]] 输出:3
题目解析
- 1.给定一些点,求哪些点在一条直线上
- 2.常见的做法有两种:
- 第一种:计算每个点和其他点的斜率比
(y2 - y1)/ (x2 - x1)
,将斜率比按数值
存进map
- 第二种:计算每个点和其他点的斜率比
(y2 - y1)/ (x2 - x1)
,将斜率比按字符串
存进map
3.这里需要注意一下,我们在计算斜率的时候,会出现分母为0的情况,在C++中不影响程序的运行,但是在Java中是影响程序运行的。我们去看下Java官方关于这一块的定义:
Thrown when an exceptional arithmetic condition has occurred. For example, an integer "divide by zero" throws an instance of this class. 当出现异常的运算条件时,抛出此异常。 例如,一个整数“除以零”时,抛出此类的一个实例。
- 所以,我们需要在我们整除的时候,将分子置为
小数
类型
题目代码
class Solution { public int maxPoints(int[][] points) { if(points.length == 1){ return 1; } int max = 0; for (int i = 0; i < points.length; i++) { int x = points[i][0]; int y = points[i][1]; HashMap<Double, Integer> map = new HashMap<>(); for (int j = 0; j < points.length; j++) { if (j != i) { double target = ((points[j][1] - y) * 1.0) / (points[j][0] - x); if (map.containsKey(target)) { int value = map.get(target); map.put(target, ++value); } else { map.put(target, 2); } } } for (Map.Entry<Double, Integer> entry : map.entrySet()) { max = Math.max(max, entry.getValue()); } } return max; } }