149. Max Points on a Line
Given an array of points
where points[i] = [xi, yi]
represents a point on the X-Y plane, return the maximum number of points that lie on the same straight line.
Example 1:
Input: points = [[1,1],[2,2],[3,3]] Output: 3
Example 2:
Input: points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] Output: 4
Constraints:
1 <= points.length <= 300
points[i].length == 2
-104 <= xi, yi <= 104
- All the
points
are unique.
思路:
1. 从每一个点A开始,向剩余的所有点进行划线,对于任意的B,C点,AB 和 AC斜率相同的即为A,B,C在同一条线上的
2. 从一个点向所有其他点划线后的斜率汇总,找到最大斜率个数相同的
2. 特殊场景考虑,需要考虑重复的点。 1. 重复的点可以认为是在同一条线上 2.对于各种同一条线上的,都需要将重复的点计入,因为重复的点可以归到任意一条线上
class Solution { public int maxPoints(int[][] points) { int result = 0; // 从每一个点出发,去跟剩下的所有点进行划线 for(int i = 0; i < points.length; i++) { result = Math.max(result, getMax(points, i)); } return result; } private int getMax(int[][] points, int curr) { //针对curr点,对于所有的点进行划线,将斜率相同的进行汇总 int dup = 0;//用于处理重合的点 Map<Double, Integer> map = new HashMap<>(); int x = points[curr][0], y = points[curr][1]; for(int i = 0; i < points.length; i++) { int nx = points[i][0] - x, ny = points[i][1] - y; // 如果是重合的点,那么dup++ if(nx == 0 && ny == 0) { dup++; continue; } // 如果不重合,需要考虑垂直的情况 double slope = nx == 0 ? Double.MAX_VALUE : (double)ny / nx; map.put(slope, map.getOrDefault(slope, 0) + 1); } int result = 0; for(int val : map.values()) { result = Math.max(result, val + dup);// 最终的同一斜率的点还要加上所有的重合点dup } //特殊场景handle,如果都是重合的点 result = Math.max(result, dup); return result; } }