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;
    }
}

 

posted @ 2024-02-18 07:51  xiaoyongyong  阅读(4)  评论(0编辑  收藏  举报